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
Другие вопросы по тегам