T-SQL: сравнение двух таблиц-записей, которые не существуют во второй таблице

если UNION ALL Это дополнение в T-SQL-кода. Что такое эквивалент вычитания?

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

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

7 ответов


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

msdn кроме ссылки для Sql2k8

msdn кроме ссылки для Sql2k5


можно использовать кроме оператора вычесть один набор из другого. Вот пример кода, использующего временные таблицы 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.


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 это, вероятно, будет наиболее эффективным способом, которым вы можете это сделать.


SELECT * FROM Table1
WHERE Table1.Key NOT IN (SELECT Table2.Key FROM Table2 WHERE Table2.Key IS NOT NULL)

добавлено не равно NULL, чтобы сделать людей счастливыми.

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


к сожалению, в вашем дизайне есть проблема. вместо двух человек за столом и подрядчика. У вас должны быть люди таблицы и другой тип таблицы (если некоторые люди могут иметь несколько ролей, возможно, нужна другая таблица). В таблице "люди" Вы делаете ссылку на таблицу типов.

тогда вы просите стать

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'

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


когда я сравниваю таблицы, ища данные, которых нет в одном, который находится в другом, я обычно использую 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)

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

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)

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


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

www.auisoft.com/SQLMerger

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