Можно ли использовать несколько столбцов для не в запросе?

Я недавно видел, что кто-то отправил это как часть ответа на ТАК вопрос о запросе:

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?

7
задан froadie 12 February 2010 в 14:55
поделиться

6 ответов

Это расширение SQL. Это есть в Oracle, PostgreSQL и MySQL. В SQL Server 2005 этого нет. Насчет других я не уверен.

4
ответ дан 6 December 2019 в 21:13
поделиться

Погуглив, можно сделать вывод, что это работает с некоторыми базами данных, но не с другими. Вместо этого вы можете использовать следующее:

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)
5
ответ дан 6 December 2019 в 21:13
поделиться

Это определенно работает в 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
3
ответ дан 6 December 2019 в 21:13
поделиться

Попробуйте это

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

Примечание: это не было проверено, даже не было доказано, что это правильно.

0
ответ дан 6 December 2019 в 21:13
поделиться

Другие уже ответили на этот вопрос, но в качестве рекомендации по производительности, если вы имеете дело с данными значительного размера, всегда используйте оператор EXISTS, а не IN. Это будет быстрее почти во всех случаях.

http://decipherinfosys.wordpress.com/2007/01/21/32/

0
ответ дан 6 December 2019 в 21:13
поделиться

Насколько я знаю, нет, но если ваш тип символьный (или может быть преобразован в символьный), вы можете подделать его:

SELECT DISTINCT a, b, c  
FROM t1  
WHERE a+b+c NOT IN  
   ( SELECT DISTINCT a+b+c FROM t2 ) 
0
ответ дан 6 December 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: