web-dev-qa-db-fra.com

Comment puis-je joindre deux tables mais renvoyer uniquement des lignes qui ne correspondent pas?

J'ai deux tableaux qui ressemblent à ceci:

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

J'ai essentiellement besoin de rejoindre ces tables lorsque leurs identifiants, dates et heures correspondent. Cependant, je veux seulement renvoyer les résultats du tableau 1 qui correspondent pas avec les résultats du tableau 2.

Je sais que cela semble simple, mais là où je suis bloqué, c'est le fait qu'il y a plusieurs lignes dans le tableau 1 qui correspondent au tableau 2 (il y a plusieurs intervalles pour une heure donnée). Je dois renvoyer tous ces intervalles tant qu'ils ne correspondent pas à la même période horaire dans le tableau 2.

Exemples de données:

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

Mon jeu de résultats attendu pour cela serait les deux dernières lignes de T1. Quelqu'un peut-il me diriger sur la bonne voie?

22
Breakthrough
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)

Cela pourrait aussi être fait avec 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
55
Joe Stefanelli

Utiliser un LEFT JOIN et filtrer les lignes qui ont des colonnes non -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
24
Costi Ciudatu