Ответ 1
Вместо использования UNION используйте EXCEPT (или INTERSECT, чтобы получить только записи в обоих) как описано в
Если UNION ALL
является добавлением в T-SQL. Что эквивалентно вычитанию?
Например, если у меня есть таблица PEOPLE
и таблица EMPLOYEES
. И я знаю, удаляю ли записи EMPLOYEES
из PEOPLE
, я останусь с моими компаниями CONTRACTORS
.
Есть ли способ сделать это, похожий на UNION ALL
? Один, где мне не нужно указывать имена полей? Причина, по которой я спрашиваю, это всего лишь один гипотетический пример. Мне нужно сделать это несколько раз для разных таблиц. Предположим, что схема EMPLOYEES
и PEOPLE
одинакова.
Вместо использования UNION используйте EXCEPT (или INTERSECT, чтобы получить только записи в обоих) как описано в
Вы можете использовать оператор 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.
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)
Добавлен IS NOT NULL, чтобы люди были счастливы.
Я согласен с Томом. Его версия, скорее всего, более эффективна. Единственная возможная причина использовать мой, может быть, что это красивее.
К сожалению, в вашем дизайне есть проблема. вместо того, чтобы иметь два стола ЛЮДИ и ПОДРЯДЧИК. У вас должен быть стол 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'
(непроверенные)
Когда я сравниваю таблицы, которые ищут данные, которые не находятся в одном, который находится в другом, я обычно использую 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)
Этот запрос вернет все строки данных, которые совпадают в обеих таблицах, поэтому, если есть таблица данных, которая находится в таблице А, которая не находится в таблице Б, эта строка данных не будет получена.
Я нашел намного проще использовать такой инструмент, как SQLMerger, для этого. Результаты отображаются лучше, и вы можете продолжать все, что вам нужно, с данными после этого.
www.auisoft.com/SQLMerger <= инструмент, который упрощает сравнение данных
пример сравнения двух таблиц: http://auisoft.com/SQLMerger/How-to/visualize-differences-in-2-databases/