T-SQL: сравнение двух таблиц-записей, которые не существуют во второй таблице
если UNION ALL
Это дополнение в T-SQL-кода. Что такое эквивалент вычитания?
например, если у меня есть таблица PEOPLE
и в таблице EMPLOYEES
. И я знаю, если я удаляю EMPLOYEES
записи PEOPLE
Я останусь со своими компаниями CONTRACTORS
.
есть ли способ сделать это, подобное UNION ALL
? Где не нужно указывать имена полей? Причина по которой я спрашиваю это лишь один гипотетический пример. Мне нужно сделать это несколько раз в разных таблицах. Предположим, что схема EMPLOYEES
и PEOPLE
то же самое.
7 ответов
вместо использования UNION используйте EXCEPT, (или INTERSECT для получения только записей в обоих ) как описано в
можно использовать кроме оператора вычесть один набор из другого. Вот пример кода, использующего временные таблицы 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/