0

假设我们有一个table_a包含两个字符串和一个 int 字段的表:

CREATE TABLE `YOUR_DATABASE.table_a` (
  `A1` STRING,
  `A2` INT64,
  `A3` STRING,
);

table_a包括一些数据:

INSERT `YOUR_DATABASE.table_a` (A1, A2, A3)
VALUES("X111", 10, "2022-02-07 08:19:00"),
      ("Y222", 15, "2017-05-08 10:19:00"),
      ("X111", 0,"2011-08-02 02:30:00"),
      ("X111", 12, "2019-12-20 11:25:00"),
      ("Y222", 258, "2001-10-14 07:00:00"),
      ("Z333", 4, "2015-03-08 03:25:12")

我们还有另一个表 ,table_b它与 有点相同table_a。事实上,它table_b具有与 in 完全相同的字段和值,table_a并且它还有一个额外的 DATETIME 字段。这个额外的 DATETIME 字段B4本质上与标准 DATETIME 格式相同,A3但已转换为标准 DATETIME 格式。

CREATE TABLE `YOUR_DATABASE.table_b` (
  `B1` STRING,
  `B2` INT64,
  `B3` STRING,
  `B4` DATETIME,
);

其中的值table_b是:

INSERT `YOUR_DATABASE.table_b` (B1, B2, B3, B4)
VALUES("X111", 10, "2022-02-07 08:19:00", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2022-02-07 08:19:00"),"America/Los_Angeles")),
      ("Y222", 15, "2017-05-08 10:19:00", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2017-05-08 10:19:00"),"America/Los_Angeles")),
      ("X111", 0, "2011-08-02 02:30:00", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2011-08-02 02:30:00"),"America/Los_Angeles")),
      ("X111", 12, "2019-12-20 11:25:00", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2019-12-20 11:25:00"),"America/Los_Angeles")),
      ("Y222", 258, "2001-10-14 07:00:00", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2001-10-14 07:00:00"),"America/Los_Angeles")),
      ("Z333", 4, "2015-03-08 03:25:12", DATETIME(PARSE_TIMESTAMP("%Y-%m-%y %H:%M:%S","2015-03-08 03:25:12"),"America/Los_Angeles"))

注意,table_a可能table_b有也可能没有主键。如何检查是否包含相同的信息table_atable_b我的数据库中有几个,table_atable_b为每个创建了等效项;现在我想仔细检查并确保表格包含相同的信息。

4

2 回答 2

2

尝试以下操作:

SELECT
    *
FROM table_a
FULL OUTER JOIN table_b
 on FARM_FINGERPRINT(ARRAY_TO_STRING([A1, CAST(A2 AS STRING), A3],"")) = FARM_FINGERPRINT(ARRAY_TO_STRING([B1, CAST(B2 AS STRING), B3],""))
WHERE A1 IS NULL 
OR B1 IS NULL

此过程连接并散列每个表中的行,然后返回每侧不匹配的位置。

使用提供的样本数据,它产生: 在此处输入图像描述

于 2022-02-08T00:49:39.967 回答
0

如果您只想知道表是否包含相同的数据,那么您可以使用CHECKSUM(). 这基本上计算列中所有值的累积哈希并生成一个值。如果两个值相同,则您的表在这些列中具有相同的数据。

SELECT 
    CHECKSUM(A1), CHECKSUM(A2), CHECKSUM(A3)
FROM 
    YOUR_DATABASE.table_a

SELECT 
    CHECKSUM(A1), CHECKSUM(A2), CHECKSUM(A3)
FROM 
    YOUR_DATABASE.table_b

更多关于CHECKSUM() 这里

请记住,如果您想检查哪些列不相等,最好使用LEFT OUTER JOIN@Daniel Zagales 提到的 a 。

编辑CHECKSUM()Google BigQuery 不支持,但您可以使用它FARM_FINGERPRINT()CHECKSUM()代替。所以这就是你的代码的样子:

SELECT 
    FARM_FINGERPRINT(A1), FARM_FINGERPRINT(A2), FARM_FINGERPRINT(A3)
FROM 
    YOUR_DATABASE.table_a

SELECT 
    FARM_FINGERPRINT(A1), FARM_FINGERPRINT(A2), FARM_FINGERPRINT(A3)
FROM 
    YOUR_DATABASE.table_b

可以在此处找到有关 Google BigQuery 中哈希函数的更多信息。

于 2022-02-08T01:19:41.173 回答