2

我有两个结构相同的表。
如何检查这两个中的所有行是否相等?
即第一个表中的每一行都存在于另一个表中,反之亦然。

4

2 回答 2

4

Jeff 博客中的解决方案与 Hive 相关:http ://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx 。

“基本思想是:如果我们在所有列上对两个表的并集进行 GROUP,那么如果这两个表相同,则所有组将导致 COUNT(*) 为 2。但是对于在任何列上不完全匹配的任何行在 GROUP BY 子句中, COUNT(*) 将是 1 -- 这就是我们想要的。我们还需要在 UNION 的每个部分添加一列,以指示每一行来自哪个表,否则没有区分哪一行来自哪个表的方法。”

处理重复项的改进解决方案作为评论发布:http ://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx#3155 (从最初发布的评论中复制代码用户“佩里”)

SELECT MIN(TableName) as TableName, COL1, COL2, COL3 ...
  FROM
  (
   SELECT 'Table A' as TableName, COUNT(*) NDUPS, A.COL1, A.COL2, A.COL3, ...
    FROM Table1 A GROUP BY ID, COL1, COL2, COL3 ...
   UNION ALL
   SELECT 'Table B' as TableName, COUNT(*) NDUPS, B.COL1, B.COl2, B.COL3, ...
    FROM Table2 B
    GROUP BY ID, COL1, COL2, COL3 ...
   ) tmp
   GROUP BY NDUPS, ID, COL1, COL2, COL3 ...
   HAVING COUNT(*) = 1
   ORDER BY ID
于 2014-06-13T12:57:44.930 回答
0

这是一个有趣的。我不确定是否有更好或更简单的方法来做到这一点,但这样的事情可能会奏效:

假设您有两个表 t1 和 t2,它们每个都有两列 c1 和 c2

create view t1_counts
as select c1, c2, count(*) as num
from t1
group by c1, c2;

create view t2_counts
as select c1, c2, count(*) as num
from t2
group by c1, c2;

select t1_counts.c1, t1_counts.c2, t1_counts.num, t2_counts.num
from t1_counts full outer join t2_counts on (t1_counts.c1 = t2_counts.c1 and t1_counts.c2 = t2_counts.c2)
where t1_counts.num != t2_counts.num;

如果两个表相等,则输出将为空。

于 2013-01-24T00:54:37.967 回答