Я недавно видел, что кто-то отправил это как часть ответа на ТАК вопрос о запросе:
SELECT DISTINCT a, b, c
FROM t1
WHERE (a,b,c) NOT IN
( SELECT DISTINCT a,b,c FROM t2 )
Я немного смущен, поскольку я всегда думал, что Вы не можете использовать несколько столбцов для "НЕ В" ("где (a, b, c)", и т.д.). Этот корректный синтаксис SQL? Как насчет MySQL?
Это расширение SQL. Это есть в Oracle, PostgreSQL и MySQL. В SQL Server 2005 этого нет. Насчет других я не уверен.
Погуглив, можно сделать вывод, что это работает с некоторыми базами данных, но не с другими. Вместо этого вы можете использовать следующее:
SELECT DISTINCT a, b, c
FROM t1
WHERE NOT EXISTS
(SELECT 1 FROM t2
WHERE t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)
Это определенно работает в Oracle. Быстро надуманный пример:
SQL> select ename, job, deptno from emp
2 where (ename, deptno) in
3 ( select ename, deptno from emp
4 where job = 'MANAGER'
5 );
ENAME JOB DEPTNO
---------- --------- ----------
JONES MANAGER 20
CLARK MANAGER 10
PARAG MANAGER 30
Это также работает:
SQL> select ename, job, deptno from emp
2 where (ename, deptno) in (('JONES',20),('CLARK',10));
ENAME JOB DEPTNO
---------- --------- ----------
JONES MANAGER 20
CLARK MANAGER 10
НЕ ВХОДИТ тоже:
SQL> select ename, job, deptno from emp
2 where (ename, deptno) not in
3 ( select ename, deptno from emp
4 where job = 'MANAGER'
5 );
ENAME JOB DEPTNO
---------- --------- ----------
SMITH CLEANER 99
SCOTT ANALYST 20
KING PRESIDENT 10
FORD ANALYST 20
MILLER CLERK 10
Попробуйте это
SELECT DISTINCT a, b, c
FROM t1,
(SELECT DISTINCT a,b,c FROM t2) as tt
WHERE t1.a NOT IN tt.a
AND t1.b NOT IN tt.b
AND t1.c NOT IN tt.c
Примечание: это не было проверено, даже не было доказано, что это правильно.
Другие уже ответили на этот вопрос, но в качестве рекомендации по производительности, если вы имеете дело с данными значительного размера, всегда используйте оператор EXISTS, а не IN. Это будет быстрее почти во всех случаях.
Насколько я знаю, нет, но если ваш тип символьный (или может быть преобразован в символьный), вы можете подделать его:
SELECT DISTINCT a, b, c
FROM t1
WHERE a+b+c NOT IN
( SELECT DISTINCT a+b+c FROM t2 )