2017-11-18 2 views
0

Ich versuche eine Liste von fest codierten Ereignissen zu erhalten und mich einer Tabelle mit tatsächlichen Ereignissen anzuschließen, so dass ich tatsächlich sehen kann, ob sie ausgeführt wurden.Orakel linker äußerer Join gibt 0 Zeilen mit Daten im linken Dataset zurück

Hier meine Frage lautet:

SELECT a.Verification FROM (SELECT 'Verify ID changed' as Verification FROM DUAL 
UNION ALL 
SELECT 'Verify manual Valve closed' as Verification FROM DUAL 
UNION ALL 
SELECT 'Verify manual Valve open' as Verification FROM DUAL 
UNION ALL 
SELECT 'Visually verify Things' as Verification FROM DUAL 
) a 
LEFT OUTER JOIN JOBEVENTS c ON a.Verification = c.EVENTDESC 
WHERE c.EVT_TIME BETWEEN '22-Jan-2017' AND '22-Jan-2017' 

Wenn ich die Dokumentation zu lesen für LEFT OUTER JOIN, dann sollten Warteschlangen immer die Daten aus der linken Tabelle zurückkehren, also warum ist meine Abfrage 0 Zeilen Rückkehr (es gibt nichts, in der JOBEVENTS-Ereignistabelle sind aber immer links hart codierte Werte vorhanden).

Bin ich falsch verstanden, wie LEFT OUTER JOIN funktioniert?

+0

Ihre where-Klausel basiert auf Daten von der linken Verknüpfung. Wenn der linke Join nicht übereinstimmt, wird auch Ihre where-Klausel nicht übereinstimmen. –

Antwort

1

Machen Sie den Filter für den linken Join-Tabellenabschnitt des Joins, nicht für die Where-Klausel.

SELECT a.Verification, c.* 
FROM (
     SELECT 'Verify ID changed' as Verification FROM DUAL UNION ALL 
     SELECT 'Verify manual Valve closed' as Verification FROM DUAL UNION ALL 
     SELECT 'Verify manual Valve open' as Verification FROM DUAL UNION ALL 
     SELECT 'Visually verify Things' as Verification FROM DUAL 
    ) a 
LEFT OUTER JOIN JOBEVENTS c ON a.Verification = c.EVENTDESC 
     AND c.EVT_TIME BETWEEN '22-Jan-2017' AND '22-Jan-2017' 
; 

Alternativ können Sie Ihre where-Klausel hinzufügen, so dass NULLS von der linken verknüpften Tabelle zurückgegeben werden. zB:

SELECT a.Verification, c.* 
FROM (
     SELECT 'Verify ID changed' as Verification FROM DUAL UNION ALL 
     SELECT 'Verify manual Valve closed' as Verification FROM DUAL UNION ALL 
     SELECT 'Verify manual Valve open' as Verification FROM DUAL UNION ALL 
     SELECT 'Visually verify Things' as Verification FROM DUAL 
    ) a 
LEFT OUTER JOIN JOBEVENTS c ON a.Verification = c.EVENTDESC 
WHERE (c.EVT_TIME BETWEEN '22-Jan-2017' AND '22-Jan-2017' 
     OR c.EVENTDESC IS NULL 
    ) 
; 

immer mit äußeren verknüpften Tabellen kümmern, wenn sie in der where-Klausel verwiesen wird, die Sie NULLS aus dieser Tabelle erlauben, sonst hat man die gleichen Bedingungen eines inneren erstellen join (& manchmal auch als „implizite innere Verknüpfung“) .

Verwandte Themen