我有两个结构相同的表。
如何检查这两个中的所有行是否相等?
即第一个表中的每一行都存在于另一个表中,反之亦然。
问问题
1747 次
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 回答