SQL Left Join Verlust von Zeilen nach dem Filtern

8

Ich habe einen Join mit mehreren Tabellen (nur zwei im Beispiel), in dem ich alle Zeilen aus der Basistabelle behalten muss. Offensichtlich verwende ich einen LINKEN JOIN, um alle Zeilen in der Basistabelle einzubeziehen. Ohne die WHERE-Klausel funktioniert es großartig - Wenn eine Zeile in der rechten Tabelle nicht existiert, wird die Zeile aus der linken Tabelle immer noch angezeigt, nur mit einer 0 aus der Spalte in der rechten Tabelle. Die ersten beiden Zeilen im Dataset sind Labels aus der linken Tabelle und Anzahl der Zeilen aus der rechten Tabelle, gruppiert nach Label. Alles, was ich will, ist eine Zählung von 0, wenn einem Label kein Wert aus Tabelle2 zugewiesen ist.

Tabelle1

%Vor%

Tabelle2

%Vor%

Abfrage :

%Vor%

Gutes Ergebnis - Keine Filter

%Vor%

Großartig!

Mein Problem ist, dass, wenn ich Filterkriterien hinzufüge, um Zeilen aus der Right-Tabelle zu entfernen, die Zeile für meine Links-Join-Zeilen entfernt wird (sie werden auf Null gesetzt), werden die Linken Zeilen gelöscht. Ich brauche die Linken Zeilen, um auch dann zu bleiben, wenn ihre Anzahl auf Null gefiltert ist.

%Vor%

Bummer Result Set - Nach Filtern

%Vor%

Dukes!

Also, was zur Hölle? Muss ich eine temporäre Tabelle mit dem gefilterten Dataset erhalten THEN verbinden Sie es mit der linken Tabelle? Was vermisse ich? Danke!

Führen Sie einen zweiten oder rekursiven Join aus. Holen Sie sich meine "gute" Join-Tabelle, holen Sie sich eine zweite "gefilterte" Tabelle, dann LINKS verbinden Sie sie

    
BClaydon 11.09.2013, 20:19
quelle

4 Antworten

13

Sie filtern nach der zweiten Tabelle in where . Die Werte könnten NULL sein und NULL schlägt die Vergleiche fehl.

Verschieben Sie die Bedingung where in die on -Klausel:

%Vor%     
Gordon Linoff 11.09.2013, 20:23
quelle
3

verschieben Sie einfach die Bedingung in WHERE -Klausel in die ON -Klausel.

%Vor%     
John Woo 11.09.2013 20:23
quelle
0

Zuerst denke ich nicht, dass es eine gute Idee ist, Nummer als Alias ​​zu haben. Verwenden Sie stattdessen ein Zeichen oder ein Wort.

Ich würde die Kriterien in den Join legen.

%Vor%

Andere Kommentare:

  1. Ich würde das Format ANSI (yyyyMMdd) für die Daten verwenden, damit es kein Missverständnis gibt.
  2. Ich wäre mir der BETWEEN bewusst, da es nicht klar ist, was Sie tun möchten, wenn das Datum "20101231 01:00" ist. Möchten Sie dieses Datum einbeziehen oder nicht? & gt; = und & lt; = oder & gt; = und & lt; ist klarer.
Giannis Paraskevopoulos 11.09.2013 20:23
quelle
0
___ answer18750532 ___

Sie filtern nach der zweiten Tabelle in %code% . Die Werte könnten %code% sein und %code% schlägt die Vergleiche fehl.

Verschieben Sie die Bedingung %code% in die %code% -Klausel:

%Vor%     
___ qstnhdr ___ SQL Left Join Verlust von Zeilen nach dem Filtern ___ answer18750531 ___

Zuerst denke ich nicht, dass es eine gute Idee ist, Nummer als Alias ​​zu haben. Verwenden Sie stattdessen ein Zeichen oder ein Wort.

Ich würde die Kriterien in den Join legen.

%Vor%

Andere Kommentare:

  1. Ich würde das Format ANSI (yyyyMMdd) für die Daten verwenden, damit es kein Missverständnis gibt.
  2. Ich wäre mir der BETWEEN bewusst, da es nicht klar ist, was Sie tun möchten, wenn das Datum "20101231 01:00" ist. Möchten Sie dieses Datum einbeziehen oder nicht? & gt; = und & lt; = oder & gt; = und & lt; ist klarer.
___ qstntxt ___

Ich habe einen Join mit mehreren Tabellen (nur zwei im Beispiel), in dem ich alle Zeilen aus der Basistabelle behalten muss. Offensichtlich verwende ich einen LINKEN JOIN, um alle Zeilen in der Basistabelle einzubeziehen. Ohne die WHERE-Klausel funktioniert es großartig - Wenn eine Zeile in der rechten Tabelle nicht existiert, wird die Zeile aus der linken Tabelle immer noch angezeigt, nur mit einer 0 aus der Spalte in der rechten Tabelle. Die ersten beiden Zeilen im Dataset sind Labels aus der linken Tabelle und Anzahl der Zeilen aus der rechten Tabelle, gruppiert nach Label. Alles, was ich will, ist eine Zählung von 0, wenn einem Label kein Wert aus Tabelle2 zugewiesen ist.

Tabelle1

%Vor%

Tabelle2

%Vor%

Abfrage :

%Vor%

Gutes Ergebnis - Keine Filter

%Vor%

Großartig!

Mein Problem ist, dass, wenn ich Filterkriterien hinzufüge, um Zeilen aus der Right-Tabelle zu entfernen, die Zeile für meine Links-Join-Zeilen entfernt wird (sie werden auf Null gesetzt), werden die Linken Zeilen gelöscht. Ich brauche die Linken Zeilen, um auch dann zu bleiben, wenn ihre Anzahl auf Null gefiltert ist.

%Vor%

Bummer Result Set - Nach Filtern

%Vor%

Dukes!

Also, was zur Hölle? Muss ich eine temporäre Tabelle mit dem gefilterten Dataset erhalten THEN verbinden Sie es mit der linken Tabelle? Was vermisse ich? Danke!

Führen Sie einen zweiten oder rekursiven Join aus. Holen Sie sich meine "gute" Join-Tabelle, holen Sie sich eine zweite "gefilterte" Tabelle, dann LINKS verbinden Sie sie

    
___ answer18750539 ___

verschieben Sie einfach die Bedingung in %code% -Klausel in die %code% -Klausel.

%Vor%     
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ tag123leftjoin ___ Ein linker Join ist ein äußerer Join, der ein Ergebnis erzeugt, das alle Datensätze der "linken" Tabelle enthält, auch wenn in anderen Tabellen, die am Join teilnehmen, keine übereinstimmenden Datensätze vorhanden sind. ___ antwort18750548 ___

Wenn Sie SQL Server verwenden, setzen Sie die Daten in einfache Anführungszeichen. Wenn nicht, wird der Ausdruck anstelle des Datums ausgewertet.

%Vor%     
___
Nicholas Post 11.09.2013 20:24
quelle

Tags und Links