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

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

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

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

Ответ 2

Вы можете использовать оператор 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.

Ответ 3

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

Ответ 4

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

Добавлен IS NOT NULL, чтобы люди были счастливы.

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

Ответ 5

К сожалению, в вашем дизайне есть проблема. вместо того, чтобы иметь два стола ЛЮДИ и ПОДРЯДЧИК. У вас должен быть стол 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'

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

Ответ 6

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

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

Ответ 7

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

www.auisoft.com/SQLMerger <= инструмент, который упрощает сравнение данных

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