Rya*_*ull 1 sql comparison set-difference google-bigquery difference
我正在寻找一种通用方法来比较 BigQuery 中的两个表,即使它们具有 STRUCT 类型的列。
它应该适用于任何一对表,理想情况下不涉及编写依赖于表的实际列的查询。我真正需要知道的是这些表是否相等,但如果它可以向我显示不同行之间的差异,那将是一个奖励。
所以像(在伪代码中)
sizeOf( TABLE A EXCEPT TABLE B ) == 0
或者
Hash(TABLE A) == HASH(TABLE B)
会好的。
我尝试使用这个:
( SELECT * FROM table1
EXCEPT DISTINCT
SELECT * FROM table2)
UNION ALL
( SELECT * FROM table2
EXCEPT DISTINCT
SELECT * FROM table1)
Run Code Online (Sandbox Code Playgroud)
但我收到了这个错误。
Column 1 in EXCEPT ALL has type that does not support set operation comparisons: STRUCT at [3:5]
Run Code Online (Sandbox Code Playgroud)
有谁知道解决这个问题的方法?
之前应该提到过,但无论表格行的顺序如何,我都需要它来工作。
我认为你正在寻找像下面这样的东西开始
#standardSQL
SELECT TO_JSON_STRING(a) FROM `project.dataset.tableA` a
EXCEPT DISTINCT
SELECT TO_JSON_STRING(b) FROM `project.dataset.tableB` b
Run Code Online (Sandbox Code Playgroud)
或者,更完整的示例 - 显示差异 - 注意:对于真正不同的表,这可能是非常令人筋疲力尽的输出
#standardSQL
SELECT 'a' table, * FROM (
SELECT TO_JSON_STRING(a) record FROM `project.dataset.tableA` a
EXCEPT DISTINCT
SELECT TO_JSON_STRING(b) FROM `project.dataset.tableB` b
)
UNION ALL
SELECT 'b', * FROM (
SELECT TO_JSON_STRING(b) FROM `project.dataset.tableB` b
EXCEPT DISTINCT
SELECT TO_JSON_STRING(a) FROM `project.dataset.tableA` a
)
Run Code Online (Sandbox Code Playgroud)