SQL Server 2008 EXCEPT оператор
Вот мой пример скрипта:
SELECT c2, c3, c4 FROM Table1
EXCEPT
SELECT c2, c3, c4 FROM Table2
Я успешно возвращаю уникальные записи из левой таблицы, которые также не существуют в правой таблице. Обе таблицы имеют идентичные схемы и по большей части идентичные данные. Проблема в том, что уникальный идентификатор (назовем его столбцом c1) не совпадает, поэтому мне нужно исключить его в приведенном выше запросе EXCEPT. Как я могу вернуть тот же набор записей, но с включенными уникальными идентификаторами?
Я думал об использовании временных таблиц, курсоров и длинных операторов WHERE внутри курсора, но это не кажется очень элегантным решением. Есть ли другой способ выполнить эту, казалось бы, простую задачу?
4 ответа
Можете ли вы принять ваш поставленный запрос, и просто inner join
это с таблицей 1, чтобы получить ваш столбец 'c1'?
SELECT T1.* FROM Table1 T1 INNER JOIN(
SELECT c2, c3, c4 FROM Table1
EXCEPT
SELECT c2, c3, c4 FROM Table2
) a on a.c2=T1.c2 and a.c3=T1.c3 and a.c4=T1.c4
Попробуй это
SELECT A.c1, A.c2, A.c3, A.c4
FROM Table1 A
LEFT OUTER JOIN Table2 B ON A.c2 = B.C2 AND A.c3 = B.C3 AND A.c4 = B.C4
WHERE B.c1 IS NULL;
Вы, вероятно, можете сделать это, используя "NOT EXISTS", а не "EXCEPT", поскольку с "NOT EXISTS" вы можете указать условия. Вот нить, которая указывает на это: ИСКЛЮЧИТЬ против НЕ СУЩЕСТВУЕТ.
Это довольно уродливо, и для больших таблиц, в которых отсутствуют "полезные" индексы, они могут работать очень плохо, но это сработает:
SELECT t1.c1, t1.c2, t1.c3, t1.c4
from Table1 t1
inner join (-- Unique tuples
SELECT c2, c3, c4 FROM Table1
EXCEPT
SELECT c2, c3, c4 FROM Table2
) xx
on xx.c2 = t1.c2
and xx.c3 = t1.c3
and xx.c5 = t1.c4