2012-07-30 2 views
12

Ich möchte alle Datensätze aus einer Tabelle T1 auswählen, wo die Werte in Spalten A und B kein übereinstimmendes Tupel für die Spalten C und D in Tabelle T2 hat.T-SQL "Wo nicht in" mit zwei Spalten

In mysql “Where not in” using two columns Ich kann lesen, wie das mit der Form erreicht wählen A, B von T1 wo (A, B) nicht in (SELECT C, D von T2), aber das scheitert in T-SQL für mich resultierend "Falsche Syntax in der Nähe ','.".

Also, wie mache ich das?

Antwort

22

Verwenden Sie eine korrelierte Unterabfrage:

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

Stellen Sie sicher, es gibt einen zusammengesetzten Index für SecondaryTable über (c, d), es sei denn, daß die Tabelle nicht viele Zeilen enthält.

+0

Dies ist eine ausgezeichnete Wahl! – RolandoCC

+0

Funktioniert nicht. FirstTable ist nicht in der zweiten SELECT deklarieren. –

4

Sie können dies nicht mit einer WHERE IN-Anweisung tun.

Stattdessen können Sie LEFT JOIN in die Zieltabelle (T2) und wählen, wo T2.ID NULL ist.

Zum Beispiel

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

nur Rück Zeilen aus T1, die in T2 nicht eine entsprechende Reihe aufweisen.

+0

Ich bin mir nicht sicher, ob ich das verstehe, aber Tomalak hat mir anscheinend eine Antwort gegeben! Danke aber! –

1

Ich verwendete es in Mysql, weil in Mysql gibt es keine "EXCLUDE" Aussage.

Dieser Code:

  1. Concates Felder C und D der Tabelle T2 in ein neues Feld, um es einfacher zu machen, um die Spalten zu vergleichen.
  2. Verknüpft die Felder A und B der Tabelle T1 zu einem neuen Feld, um den Vergleich der Spalten zu erleichtern.
  3. Wählt alle Datensätze aus, bei denen der Wert des neuen T1-Feldes nicht dem Wert des neuen T2-Feldes entspricht.

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

Können Sie erklären, warum diese Aussage die Frage beantwortet? –

+0

FH-Inway: Ich schreibe den Kommentar vor dem Code. –

+0

Danke. Kannst du dir deinen ersten Satz ansehen? Ich bin mir nicht sicher, was du damit sagen willst. Die Frage lautete T-SQL, weil MySQL 'WHERE NOT IN' nicht unterstützt. –