Links-Outer Join in Postgres Keine Rückgabewerte für Null

8

Ein Download besteht aus Download-Zeiten, Download-Zeit-ID und Buno-ID. Fehler bestehen aus Fehlercodes, Download-Zeit-ID, Status und Typ. Ein Download kann viele Fehler enthalten und kann mit der Download-Zeit-ID verknüpft werden.

Bei einer Reihe von Fehlercodes müssen die Ergebnisse jeden Fehlercode mit einer entsprechenden Fehlerzählung enthalten. Wenn im Download kein Fehlercode gefunden wird, muss der Fehlercode mit einem Fehlerzählwert von Null zurückgegeben werden.

Das Problem scheint einen OUTER JOIN zu erfordern, aber ich habe nicht gesehen, dass dies bei Postgres so funktioniert, wie es erwartet wird, da es die Menge nicht mit Nullen aus der LINKEN Tabelle zurückgibt.

Die Abfrage ist unten, wobei einige Details der Kürze halber weggelassen sind:

%Vor%

Am folgenden Tag habe ich bearbeitet, um die Antwort zu zeigen. Alle Antworten waren nah und hatten verschiedene Elemente der Unterstützung. Die Antwort von JayC war jedoch am nächsten. Hier ist das letzte SQL, das die einzige Änderung hat, da die WHERE-Klausel die Fehlercode-IN-Anweisung verwendet:

%Vor%

Danke, alles für Ihre Hilfe! Liebe diese Seite!

    
MAbraham1 14.05.2012, 20:02
quelle

4 Antworten

20

Ich gebe meine Antwort, weil ich erhebliche Zweifel an den anderen Antworten habe. Sie müssen auf Filteranforderungen achten. Denken Sie daran, dass die where-Klausel nach Ihren Joins ausgeführt wird. Wenn Filteranforderungen in der where-Klausel vorhanden sind, die sich auf die nicht äußere verbundene Tabelle beziehen, haben Sie (in vielen Fällen) Ihre äußere Verknüpfung ungültig gemacht. Mit sql scheint es die einfachste Lösung zu sein, entweder den richtigen Join zu verwenden oder die Tabellennamen entsprechend zu verschieben und dann die Filterbedingungen aus der where-Klausel in die joink-Klausel zu verschieben.

%Vor%

Ein anderer Weg, von dem ich glaube, dass er gleichwertig sein sollte, ist

%Vor%

Es ist nicht unbedingt wichtig, wo die Filteranforderungen für fs_fault sind. (und Ihre SQL-Engine wird das sowieso ändern).

Bearbeiten: Hier ist ein SQLFiddle , der die Filterung der Join-Klausel gegenüber der Where-Klausel demonstriert.

    
JayC 15.05.2012, 00:30
quelle
2

Dies erfordert ein RIGHT OUTER JOIN . Der rechte äußere Join enthält alle Werte aus der rechten Tabelle, mit NULL s, wo es keinen Eintrag in der linken Tabelle gibt (ich bin mir nicht sicher, ob das mit GROUP BY funktioniert, obwohl ...) if fs_fault waren eine Tabelle mit allen Fehlercodes.

In Ihrem Fall scheint fs_fault alle Fehler für einen Download zu enthalten. Könnte dies für das unerwartete Verhalten der Fall sein?

    
krlmlr 14.05.2012 20:11
quelle
2

Wenn Sie nach Fehlercode zählen möchten, scheint dies die einfachste Lösung zu sein:

%Vor%

Beachten Sie, dass ich Ihre Bedingungen beibehalten habe, wo Fehler nicht gezählt werden, wenn sie nicht die richtige Statusid oder Bunoid haben. Ich hatte ein bisschen Angst, dass die Datumsauswahl nicht das getan hat, was Sie dachten, also schlug ich eine Alternative vor. Auch wenn Sie% ce_de% verwenden, könnte das nicht ausreichen, aber das ist eine andere Geschichte. Ich habe auch eine TIMESTAMP WITHOUT TIME ZONE -Klausel hinzugefügt, da die Ergebnisse wahrscheinlich nicht inkonsistent sind. ohne diese Klausel kann es in ORDER BY sequence sein oder auch nicht, und das könnte sich ohne Warnung ändern.

    
kgrittn 14.05.2012 20:57
quelle
1

Der linke äußere Join wählt alles in der ersten Tabelle plus übereinstimmende Zeilen in der zweiten Tabelle aus. Die erste Tabelle scheint aus Download-Versuchen zu bestehen. Ihr Ergebnis aus dem "Von" schließt also alle Download-Versuche ein.

Aber es enthält nicht unbedingt alle Fehlercodes. Was passiert ist, dass Sie keine Fehler für einen oder mehrere Codes haben, die die Kriterien erfüllen.

Sie benötigen eine Tabelle, die alle Fehlercodes enthält, damit dies funktioniert. Hier erstelle ich nur eine Liste der Fehlercodes als erste Tabelle. Ich denke, die folgende Abfrage macht das:

%Vor%

Ich gebe zu: Ich verwende SQL Server-Syntax, um "die Standardwerte" zu erstellen.

    
Gordon Linoff 14.05.2012 20:19
quelle

Tags und Links