T-SQL: сравнение двух таблиц - записей, которых нет во второй таблице - PullRequest
10 голосов
/ 16 декабря 2008

Если UNION ALL - это сложение в T-SQL. Что эквивалентно вычитанию?

Например, если у меня есть таблица PEOPLE и таблица EMPLOYEES. И я знаю, что если я удалю EMPLOYEES записей из PEOPLE, у меня останутся мои компании CONTRACTORS

Есть ли способ сделать это, похожий на UNION ALL? Один, где мне не нужно указывать имена полей? Причина, по которой я спрашиваю, состоит в том, что это всего лишь один гипотетический пример. Мне нужно сделать это несколько раз для разных таблиц. Предположим, что схемы EMPLOYEES и PEOPLE совпадают.

Ответы [ 7 ]

12 голосов
/ 16 декабря 2008

Вы можете использовать оператор EXCEPT для вычитания одного набора из другого. Вот пример кода с использованием временных таблиц EMPLOYEES и PEOPLE. Насколько я знаю, вам нужно будет использовать имена полей с оператором EXCEPT.

CREATE TABLE #PEOPLE
(ID INTEGER,
 Name NVARCHAR(50))

CREATE TABLE #EMPLOYEE
(ID INTEGER,
 Name NVARCHAR(50))
GO

INSERT #PEOPLE VALUES (1, 'Bob')
INSERT #PEOPLE VALUES (2, 'Steve')
INSERT #PEOPLE VALUES (3, 'Jim')
INSERT #EMPLOYEE VALUES (1, 'Bob')
GO

SELECT ID, Name
FROM #PEOPLE
EXCEPT 
SELECT ID, Name
FROM #EMPLOYEE
GO

Последний запрос вернет две строки в таблице PEOPLE, которых нет в таблице EMPLOYEE.

11 голосов
/ 16 декабря 2008

Вместо использования UNION используйте EXCEPT (или INTERSECT, чтобы получить только записи в обоих) как описано в

msdn, КРОМЕ Ссылка для Sql2k8

msdn, КРОМЕ Ссылка для Sql2k5

11 голосов
/ 16 декабря 2008
SELECT
     P.*
FROM
     People P
LEFT OUTER JOIN Employees E ON
     E.ID = P.ID     -- Or whatever your PK-FK relationship is
WHERE
     E.ID IS NULL

Для SQL Server это, вероятно, самый эффективный способ сделать это.

3 голосов
/ 16 декабря 2008
SELECT * FROM Table1
WHERE Table1.Key NOT IN (SELECT Table2.Key FROM Table2 WHERE Table2.Key IS NOT NULL)

Добавлено НЕ НУЛЬ, чтобы сделать людей счастливыми.

Я бы согласился с Томом. Его версия, скорее всего, более эффективна. Единственная возможная причина использовать мою, может быть, она красивее.

1 голос
/ 26 июня 2011

Когда я сравниваю таблицы в поисках данных, которых нет в другой, я обычно использую SQL Division.

select *(or selected matching field) 
from tableA as A
where not exist
(select *(or selected matching field) 
from tableB as B 
where A.key = B.key)

Этот запрос вернет результаты, которые находятся в таблице A и не находятся в процессе деления.

select *(or selected matching field) 
from tableA as A
where exist
(select *(or selected matching field) 
from tableB as B 
where A.key = B.key)

Этот запрос вернет все строки данных, которые совпадают в обеих таблицах, поэтому, если в таблице A есть данные строки, которых нет в таблице B, эта строка данных не будет получена.

1 голос
/ 16 декабря 2008

К сожалению, есть проблема в вашем дизайне. вместо двух столиков ЛЮДИ и ПОДРЯДЧИК. У вас должна быть таблица PEOPLE и другая таблица TYPE (если у некоторых людей может быть несколько ролей, может понадобиться другая таблица) В вашей таблице PEOPLE вы делаете ссылку на таблицу TYPE.

тогда ваши запросы станут

SELECT * from PEOPLE, TYPE
WHERE PEOPLE.type_id = TYPE.id 
AND TYPE.name = 'CONTRACTOR'

SELECT * from PEOPLE, TYPE
WHERE PEOPLE.type_id = TYPE.id 
AND TYPE.name = 'EMPLOYEE'

(непроверенные)

0 голосов
/ 05 мая 2009

Я обнаружил, что гораздо проще использовать такой инструмент, как SQLMerger, чтобы сделать это для вас. Результаты отображаются в более удобной форме, и вы можете легко продолжить работу с данными после этого.

www.auisoft.com / SQLMerger <= инструмент, позволяющий легко сравнивать данные </p>

пример сравнения двух таблиц: http://auisoft.com/SQLMerger/How-to/visualize-differences-in-2-databases/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...