2010-02-12 11 views
5

Hace poco vi alguien publicar esto como parte de una respuesta a una pregunta para consulta:¿Se puede usar varias columnas para una consulta no?

SELECT DISTINCT a, b, c 
FROM t1 
WHERE (a,b,c) NOT IN 
    (SELECT DISTINCT a,b,c FROM t2) 

estoy un poco confuso, ya que siempre pensé que no se puede utilizar varias columnas para "NO EN" ("donde (a, b, c)", etc.). ¿Es esta sintaxis SQL correcta? ¿Y qué hay de MySQL?

Respuesta

3

Es una extensión de SQL. Oracle, PostgreSQL y MySQL lo tienen. SQL Server 2005 no lo tiene. No estoy seguro acerca de los demás.

+0

Oracle también lo tiene. –

0

No que yo sepa, pero si thy're tipo de caracteres (o se puede convertir a char tipos), que se puede fingir:

SELECT DISTINCT a, b, c 
FROM t1 
WHERE a+b+c NOT IN 
    (SELECT DISTINCT a+b+c FROM t2) 
+0

Esto tiene un error en ella. a = 'ab' b = 'cd' c = 'ef' coincidirá con a = 'abcd' b = 'e' c = 'f' ... –

+0

Tendría que tener cuidado para asegurarse de no hacerlo t obtener colisiones basadas en el contenido de la columna. Puse separadores para que las columnas no se ejecuten juntas accidentalmente, dando como resultado falsos positivos: 'a' + 'bb' + 'c "==' ab '+' b '+' c ' – tvanfosson

+0

No funcionará para ciertas cadenas, sin embargo ... a + b podría ser "abc" para a = "ab" yb = "c", o a = "a" yb = "bc". – Corey

0

probar este

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 

Nota: Esto no ha sido probado, aún no se ha demostrado correcta.

+0

Mi pregunta no es cómo hacerlo, sé de varias maneras. Solo quería saber si la sintaxis fue correcta, como alguien la publicó y nadie objetó. – froadie

+0

@froadie Perdón por mi malentendido. Otras personas han respondido correctamente a tu pregunta. Veo. –

1

Sin duda funciona en Oracle. Rápida ejemplo artificioso:

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 

Esto también funciona:

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 
NO EN

también:

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

Pregunta sobre 'NO EN'. No solo 'EN' –

+0

@David Oneill: ¿no puede suponer que si uno funciona, también lo hace el otro? – froadie

+0

Se agregó el ejemplo NOT IN solo para estar seguro ! –

2

buscar en Google que sugiere que va a trabajar en algunas bases de datos pero no en otros. Se puede utilizar en su lugar:

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) 
0

Otros ya han respondido a la pregunta, sino como una sugerencia de rendimiento, si usted está tratando con datos de cualquier tamaño significativo siempre utilice la sentencia EXISTS en lugar de IN. Será más rápido en casi todos los casos.

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

Cuestiones relacionadas