2011-07-07 16 views
19

Tengo dos tablas que se ven así:¿Cómo puedo unir dos tablas pero solo devolver las filas que no coinciden?

T1: ID | Date | Hour | Interval 
T2: ID | Date | Hour 

Básicamente necesito para unirse a estas tablas cuando sus documentos de identidad, fechas y horas de los partidos. Sin embargo, sólo quiero devolver los resultados de la tabla 1 que hacen no coinciden con los resultados en la tabla 2.

Sé que esto parece simple, pero donde estoy atascado es el hecho de que hay varias filas en la tabla 1 que coinciden con la tabla 2 (hay múltiples intervalos para cualquier hora dada). Tengo que devolver todos estos intervalos, siempre que no entran en el mismo período de una hora en la tabla 2.

datos Ejemplo:

T1: 1 | 1/1/2011 | 1 | 1 
    1 | 1/1/2011 | 1 | 2 
    1 | 1/1/2011 | 2 | 1 
    1 | 1/1/2011 | 2 | 2 

T2: 1 | 1/1/2011 | 1 

Mi resultado esperado fijado para este serían las dos últimas filas desde T1. ¿Alguien puede señalarme en el camino correcto?

Respuesta

50
SELECT T1.* 
    FROM T1 
    WHERE NOT EXISTS(SELECT NULL 
         FROM T2 
         WHERE T1.ID = T2.ID 
          AND T1.Date = T2.Date 
          AND T1.Hour = T2.Hour) 

También se podría hacer con un LEFT JOIN:

SELECT T1.* 
    FROM T1 
     LEFT JOIN T2 
      ON T1.ID = T2.ID 
       AND T1.Date = T2.Date 
       AND T1.Hour = T2.Hour 
    WHERE T2.ID IS NULL 
+0

Gracias por su respuesta, Ambas consultas funcionan bien con MS Access. Para ser honesto, nunca supe que podrías combinar declaraciones 'SELECT' como esa, +1. – Breakthrough

+0

En realidad, una respuesta más - Fui con la primera opción, la cláusula 'WHERE NOT EXISTS'. Ingenioso, nunca pensé que pudieras hacer eso, funcionó maravillosamente. – Breakthrough

+6

Tenga en cuenta que NOT EXISTS no está bien optimizado por el procesador de consultas Jet/ACE y no siempre usará índices en ambos lados de la comparación (lo mismo es cierto para NOT IN, en un grado mucho mayor). Por lo tanto, a medida que crece el conjunto de datos, puede ver un gran golpe de rendimiento con la versión NO EXISTE. La versión JOIN siempre utilizará todos los índices disponibles. –

20

Utilice un LEFT JOIN y filtrar las líneas que tienen columnas no NULL T2:

SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.ID = T2.ID 
    AND T1.Date = T2.Date AND T1.Hour = T2.Hour 
    WHERE T2.ID IS NULL 
+0

+1 y gracias por la respuesta, pero tuve que ir con Joe (respondió unos minutos más rápido). – Breakthrough

Cuestiones relacionadas