2014-04-11 6 views
0

Вот мой пример сценария:SQL Server 2008 КРОМЕ заявление

SELECT c2, c3, c4 FROM Table1 
EXCEPT 
SELECT c2, c3, c4 FROM Table2 

Я успешно возвращаются уникальные записи из левой таблицы, которые не существуют и в правой таблице. Обе таблицы имеют одинаковые схемы и по большей части идентичные данные. Проблема в том, что уникальный id (назовем его столбцом c1) не соответствует, поэтому мне нужно исключить его в запросе EXCEPT выше. Как я могу вернуть один и тот же набор записей, но с уникальными идентификаторами?

Я думал использовать временные таблицы, курсоры и длинные инструкции WHERE внутри курсора, но это не похоже на очень элегантное решение. есть ли другой способ выполнить эту, казалось бы, простую задачу?

+0

Какой уникальный идентификатор вы хотите, чтобы вытащить, если запись существует в обеих таблицах? –

ответ

1

Попробуйте

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; 
+0

Спасибо, я попробую это. –

+0

Это прекрасно работало! Благодаря! –

1

Вы, вероятно, может выполнить его с помощью «НЕ СУЩЕСТВУЕТ», а не «КРОМЕ», так как с «НЕ СУЩЕСТВУЕТ» вы можете указать условия. Вот нить, которая указывает на это: EXCEPT vs NOT EXISTS.

2

Можете ли вы взять предоставленный вами запрос и просто 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 
+1

+1, потому что вы избили меня (но вы хотите проверить свои псевдонимы таблицы ...) –

+0

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

+0

@rs. - Я хотел использовать исходный запрос OP, поскольку я знаю, что он уже производит все результаты, которые он хочет, минус c1. –

0

Это своего рода уродливые и на больших таблицах, не имеющих «полезные» индексы, может выполнять очень плохо, но это будет делать работу:

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 
Смежные вопросы