6 Stimmen

SQL-Wo-Klausel für linke äußere Verknüpfung

Ich habe ein Problem mit einer Ansicht, die ich erstellen möchte. Ich habe zwei Tabellen, die über einen Left Outer Join verbunden sind, z.B. tableA y tableB , wobei tableB ist links außen verbunden.

Ich möchte nur die Zeilen aus Tabelle B auswählen, in denen state gleich 4 ist, also füge ich hinzu WHERE state = 4 auf meine Anfrage. Jetzt ist die Ergebnismenge ziemlich beschnitten, weil alle Zeilen ohne eine passende Zeile in tableB werden aus dem Ergebnis entfernt (da der Zustand für diese Zeilen nicht 4 ist). Ich habe auch versucht WHERE state = 4 OR state IS NULL funktioniert ebenfalls nicht (da state ist technisch nicht NULL wenn es keinen Zustand gibt).

Was ich also brauche, ist eine WHERE Anweisung, die nur ausgewertet wird, wenn es tatsächlich eine Zeile gibt, gibt es so etwas?

Wenn nicht, sehe ich zwei Möglichkeiten: join (SELECT * FROM tableB WHERE state = 4) anstelle von Tabelle B, oder erstellen Sie einen View mit demselben WHERE Anweisung und verbinden Sie diese stattdessen. Was ist die beste Option in Bezug auf die Leistung?

Dies ist übrigens SQL Server 2008 R2.

7voto

Guffa Punkte 663241

Sie stellen die Bedingungen in den on Klausel. Beispiel:

select a.this, b.that
from TableA a
left join TableB b on b.id = a.id and b.State = 4

5voto

Mikael Eriksson Punkte 132244

Sie können hinzufügen state = 4 auf die Join-Bedingung.

select * 
from T1
  left outer join T2
    on T1.T1ID = T2.T1ID and
       T2.state = 4

2voto

Andomar Punkte 224164

Noch einfacher als eine Unterabfrage ist die Erweiterung der on Klausel, wie;

select  *
from    TableA a
left    join
        TableB b
on      a.b_id = b.id
        and b.state = 4

Es erscheinen alle Zeilen aus TabelleA und nur die aus TabelleB mit Status 4.

SQL Server wird wahrscheinlich die Ansicht ausführen, erweitert on und Unterabfrage auf genau die gleiche Weise. In Bezug auf die Leistung sollte es also kaum einen Unterschied geben.

0voto

onedaywhen Punkte 52850

Alternativer Ansatz: (

SELECT A1.ID, A1.colA, B1.ColB
  FROM tableA AS A1
       INNER JOIN tableB AS B1
          ON A1.ID = B1.ID
             AND B1.state = 4
UNION
SELECT A1.ID, A1.colA, '{{MISSING}}' AS ColB
  FROM tableA AS A1
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM tableB AS B1
                     WHERE A1.ID = B1.ID
                  );

Alternativ dazu:

SELECT A1.ID, A1.colA, B1.ColB
  FROM tableA AS A1
       JOIN tableB AS B1
          ON A1.ID = B1.ID
             AND B1.state = 4
UNION
SELECT ID, colA, '{{NA}}' AS ColB
  FROM tableA 
 WHERE ID IN (
              SELECT ID
                FROM tableA
              EXCEPT 
              SELECT ID
                FROM tableB
             );

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X