it-swarm.com.de

SQL Server LEFT JOIN und WHERE-Klausel

Hier ist mein Code

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12 AND Table2.IsDefault = 1

Das Problem tritt auf, wenn Table2 NULL ist. Die Abfrage gibt also nichts zurück. 

Wie lasse ich den letzten Teil der Abfrage AND Table2.IsDefault = 1 optional?

Ich habe versucht, die Abfrage mit OR kurzzuschließen, habe aber herausgefunden, dass sie anders funktioniert als C #.

15
Felipe Miosso
SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 
ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12
29
t-clausen.dk
 AND COALESCE(Table2.IsDefault,1) = 1

Beim Lesen der Kommentare sieht es so aus, als wäre es die beste Lösung, die Bedingung in den Join zu verschieben:

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12 

Da es sich um einen OUTER-Join handelt, behalten Sie alle Table1-Informationen bei, wenn die Übereinstimmung fehlschlägt. Wenn Sie die Übereinstimmung mit "Table2 wird immer 1 Eintrag zurückgeben" beibehalten, besteht nicht die Gefahr, dass Sie zusätzliche Join-Ergebnisse filtern, indem Sie die Bedingung verschieben. Sie erhalten die Ergebnisse von same, wenn Sie die Bedingung in die WHERE-Klausel einfügen. 

Der Grund für die Verschiebung der Klausel in die ON-Klausel besteht darin, dass COALESCE(), ISNULL() und OR alle Probleme für Indizes verursachen. Mit der Bedingung in der ON-Klausel brauchen wir keine davon und sollten daher mit einem besseren Ausführungsplan enden.

2
Joel Coehoorn

Versuche dies :

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12 AND isnull(Table2.IsDefault,1) = 1

Sie waren fast da :-)

1
Laurent S.
SELECT ID, Name, Phone FROM Table1 
  LEFT JOIN Table2 ON Table1.ID = Table2.ID
  WHERE Table1.ID = 12 
    AND (Table2.IsDefault IS NULL OR Table2.IsDefault = 1);

Verwenden Sie eine Unterabfrage, um die Ergebnisse von Tabelle 2 zu filtern, bevor sie mit Tabelle 1 verbunden werden:

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN (SELECT * FROM Table2 WHERE IsDefault = 1) AS Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12
0
hargobind