您可以使用UNION ALL
到Concat的表和Group By
与Having
子句来查找重复:
SELECT x.Name, x.Age, Cnt = Count(*)
FROM (
SELECT a.Name, a.Age
FROM PersonA a
UNION ALL
SELECT b.Name, b.Age
FROM PersonB b
) x
GROUP BY x.Name, x.Age
HAVING COUNT(*) > 1
根据您的澄清的评论,你可以使用下面的查询找到PersonA
全名,年龄组合,这在PersonB
是不同的:
WITH A AS(
SELECT a.Name, a.Age, cnt = count(*)
FROM PersonA a
GROUP BY a.Name, a.Age
),
B AS(
SELECT b.Name, b.Age, cnt = count(*)
FROM PersonB b
GROUP BY b.Name, b.Age
)
SELECT a.Name, a.Age
FROM A a LEFT OUTER JOIN B b
ON a.Name = b.Name AND a.Age = b.Age
WHERE a.cnt <> ISNULL(b.cnt, 0)
Demo
如果您还想查找PersonB
但不在PersonA
中的人, HOULD使用FULL OUTER JOIN
作为戈登·利诺夫曾这样评价:
WITH A AS(
SELECT a.Name, a.Age, cnt = count(*)
FROM PersonA a
GROUP BY a.Name, a.Age
),
B AS(
SELECT b.Name, b.Age, cnt = count(*)
FROM PersonB b
GROUP BY b.Name, b.Age
)
SELECT Name = ISNULL(a.Name, b.Name), Age = ISNULL(a.Age, b.Age)
FROM A a FULL OUTER JOIN B b
ON a.Name = b.Name AND a.Age = b.Age
WHERE ISNULL(a.cnt, 0) <> ISNULL(b.cnt, 0)
Demo
我不明白你的要求是什么。你想查找记录出现在一张表中而不是另一张,或者重复记录在一张表中? – 2014-10-06 14:04:23
@ZoffDino Dino我想查找出现在一张表中的记录,而不是其他包含重复记录的记录。只有记录不重复时,“除外”才显示差异。我需要像''all''这样的东西来找出哪个关系是1到1.对于表格:'表格1:约翰23,麦克17,约翰23'和'表格2:约翰23,麦克17'''除外'没有显示不同,但这两个表是不一样的。我需要找到缺失的记录,以便当我将这些记录添加到表中时,两个表都是相同的,例如。表1:约翰23,麦克17,约翰23'和'表1:约翰23,麦克17,约翰23'。 – rgb 2014-10-06 14:44:25