2016-07-21 15 views
2

Ich habe die folgende AbfrageWarum funktioniert LINK OUTER JOIN nicht?

SELECT COUNT(*) FROM Samples 

Rückkehr 628.

Während die folgende Abfrage

SELECT * FROM 
    (

    SELECT 
    sa.*, 
    tagLists.tagNames AS tagNames, 
    tagLists.ProjectID AS ProjectID 
     FROM Samples sa 
     LEFT OUTER JOIN TagLists tagLists 
      ON sa.spotID = tagLists.taggedItemID 
      AND 6 = tagLists.taggedItemType 
) ex 

    WHERE ex.ProjectID IS NULL 

kehrt leere Tabelle.

Mit anderen Worten, äußere Abfrage

SELECT 
     sa.*, 
     tagLists.tagNames AS tagNames, 
     tagLists.ProjectID AS ProjectID 
      FROM Samples sa 
      LEFT OUTER JOIN TagLists tagLists 
       ON sa.spotID = tagLists.taggedItemID 
       AND 6 = tagLists.taggedItemType 

enthält keine jede Zeile mit ProjectID null ist beizutreten.

Warum? Ist LEFT OUTER JOIN nicht garantiert, dass alle Zeilen aus der linken Tabelle angezeigt werden sollen?

UPDATE

Leider gibt es natürlich keine nicht-null Zeilen in tagLists tatsächlich verbunden.

UPDATE 2

Sorry, Jungs Ich bin ein Narr es wirklich nicht-null Zeilen waren ich nicht war egal ...

+5

Sie haben uns keine Daten gezeigt, was diesen Kommentar spekulativ macht, aber wenn jeder Datensatz in 'Samples' mit einem Datensatz in' TagLists' übereinstimmt, dann wird 'ex.ProjectID' niemals' NULL' sein, was geben würde Ihr aktuelles Ergebnis. –

Antwort

4

Die einzige Situation, wenn Ihre Abfrage keine Daten zurückgeben würde, ist wenn jede Zeile von Samples eine entsprechende Zeile in TagLists hat, die die Join-Bedingung erfüllt, wobei alle solche Zeilen einen Nicht-NULL-Wert im Feld ProjectID haben. Mit anderen Worten, jede Probe hat einen Tag-Listenpunkt vom Typ sechs.

Eine gute Möglichkeit, dies zu testen, wäre das Entfernen der WHERE-Klausel und die Überprüfung, dass alle 628 Zeilen eine gültige ProjectID zurückgegeben haben.

+0

Das klingt sehr nach meinem Kommentar. Wie wäre es mit diesem Kommentar eine positive Bewertung abzugeben? –