2012-07-30 20 views
12

Quiero seleccionar todos los registros de una tabla T1 donde los valores en las columnas A y B no tienen tuplas coincidentes para las columnas C y D en la tabla T2.T-SQL "Where not in" usando dos columnas

En mysql “Where not in” using two columns puedo leer cómo lograr eso usando el formulario seleccione A, B de T1 donde (A, B) no está en (SELECCIONE C, D de T2), pero eso falla en T-SQL para mí dando como resultado "Sintaxis incorrecta cerca ','.".

Entonces, ¿cómo puedo hacer esto?

Respuesta

22

Utilice un sub-consulta correlacionada:

... 
WHERE 
    NOT EXISTS (
    SELECT * FROM SecondaryTable WHERE c = FirstTable.a AND d = FirstTable.b 
) 

Asegúrese de que haya un índice compuesto en SecondaryTable sobre (c, d), a menos que la tabla no contiene muchas filas.

+0

Esta es una excelente opción! – RolandoCC

+0

No funciona. FirstTable no se declara en el segundo SELECCIONAR. –

4

No puede hacer esto usando una declaración de tipo WHERE IN.

En su lugar podría LEFT JOIN a la tabla de destino (T2) y seleccionar donde T2.ID es NULL.

Por ejemplo

SELECT 
    T1.* 
FROM 
    T1 LEFT OUTER JOIN T2 
    ON T1.A = T2.C AND T1.B = T2.D 
WHERE 
    T2.PrimaryKey IS NULL 

sólo devolverá filas de T1 que no tienen una fila correspondiente en T2.

+0

No estoy seguro de entender, pero parece que Tomalak me dio una respuesta. ¡Gracias, sin embargo! –

1

Lo usé en Mysql porque en Mysql no hay una declaración de "EXCLUDE".

este código:

  1. Concates campos C y D de la tabla T2 en un nuevo campo para que sea más fácil comparar las columnas.
  2. Concatena los campos A y B de la tabla T1 en un nuevo campo para facilitar la comparación de las columnas.
  3. Selecciona todos los registros donde el valor del nuevo campo de T1 no es igual al valor del nuevo campo de T2.

SQL-Statement:

SELECT T1.* FROM T1 
    WHERE CONCAT(T1.A,'Seperator', T1.B) NOT IN 
    (SELECT CONCAT(T2.C,'Seperator', T2.D) FROM T2) 
+0

¿Podría explicar por qué esta afirmación responde la pregunta? –

+0

FH-Inway: escribo el código de comentario antes. –

+0

Gracias. ¿Podría echarle un vistazo a su primera oración, no estoy seguro de lo que quiere decir con eso? La pregunta era sobre T-SQL porque MySQL no admite 'WHERE NOT IN'. –

Cuestiones relacionadas