Вы можете использовать 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
вы s использование 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
Я не понимаю, что ваши требования. Вы хотите найти записи, отображаемые в одной таблице, а не другую, или дублировать записи в одной таблице? –
@ ZoffDino Dino Я хочу найти записи, появляющиеся в одной таблице, но не другие, включая дубликаты. «Except» показывает различия только в том случае, если записи не дублируются. Мне нужно что-то вроде ''except all'', чтобы найти, какое отношение равно 1 к 1. Для таблиц:' Таблица1: Джон 23, Майк 17, Джон 23' и 'Таблица2: Джон 23, Майк 17'' except' не показывает разница, но эти две таблицы не совпадают. Мне нужно найти отсутствующие записи, чтобы при добавлении этих записей в таблицы обе таблицы были бы одинаковыми, например. 'Таблица 1: Джон 23, Майк 17, Джон 23' и' Таблица1: Джон 23, Майк 17, Джон 23'. – rgb