我在Vertica中有以下两个表,列名为A,B,C,D。我列出了下面的行值
Table 1
100, Active, R, 80
200, Inactive, R, 20
300, Active, V, 50
500, Active, R, 30
Table 2
100, Active, R, 80
200, Inactive, R, 20
300, Inactive, V, 50
400, Inactive, R, 60
我想比较这两个表,只打印这两个表和行之间不同的行,这些行存在于一个表中,而不存在于另一个表中。我尝试了以下SQL,它适用于一个场景(它能够提供存在于一个而不是另一个中的行,但它不能)
select * from (select A,B,C,D from Table1 except select A,B,C,D from Table2) "T" union all select * from (A,B,C,D from Table2 except select A,B,C,D from Table1) "T";
300, Active, V, 50
300, Inactive, V, 50
500, Active, R, 30
400, Inactive, R, 60
但是当两个表中存在具有不同值的相同行时,我想只有一行:
300, Inactive, V, 50
500, Active, R, 30
400, Inactive, R, 60
答案 0 :(得分:1)
我假设按行表示“A”值。
假设两个表中都没有重复项,您可以使用聚合:
select a
from ((select 1 as which, a, b, c, d from t1) union all
(select 2 as which, a, b, c, d from t2)
) t
group by a
having min(b) <> max(b) or min(c) <> max(c) or min(d) <> max(d);
您可以添加其他列,具体取决于您真正想要的信息。此外,这会忽略NULL
值。处理NULL
的逻辑也稍微麻烦一点。