2016-08-08 15 views
0

I 3 Tabellen in Oracle-Datenbank abzubilden versuche:Oracle SQL Outer Left Rückkehr Join keine Zeilen

testHdr, testDet, testOther 

testHdr ist der Header-Tabelle, ist testDet die Detailtabelle und testOther ist nur der Zusatztabelle, die ich brauchen, um ein paar Spalten zu bekommen.

Es ist möglich, dass Daten in testHdr vorhanden sind, aber nicht in testDet. Ich möchte entweder leer/null Wert von testDet zeigen, wenn es keinen Wert gibt.

Key testHdr zu testDet zur Karte ist adj_no und adj_no2

SELECT hdr.*, det.*, othr.* 
FROM testHdr hdr, testDet det, testOther othr 
where hdr.adj_no = det.adj_no (+) 
and hdr.adj_no2 = det.adj_no2 (+) 
and i.key3 = det.key3 
and hdr.adj_no = '112' 

* 112 nur Satzkopf hat aber keine Detailaufzeichnung

  • Ich wünsche Daten erhalten hdr.adj_no = 112, wenn Es gibt Header-Daten wie 113, 114 usw., es wird nicht im Abfrageergebnis angezeigt.

versuchte ich die obige Abfrage mit äußeren leftjoin aber es zeigt:

ORA-01416: two tables cannot be outer-joined to each other 
+0

den adj_no Zustand bewegen, wo –

+0

@AbhilashRVankayala Joinbedingung meinst du 'wo hdr.adj_no (+) = det.adj_no und hdr.adj_no2 = det.adj_no2 (+)' nach links? – hades

+0

Nein, ich habe vorgeschlagen, wie Tim in der Antwort geschrieben hat. –

Antwort

2

Sie sollten eine explizite linke Seite beitreten:

SELECT hdr.*, det.*, othr.* 
FROM testHdr hdr 
LEFT JOIN testDet det 
    ON hdr.adj_no = det.adj_no AND 
     hdr.adj_no2 = det.adj_no2 
LEFT JOIN testOther othr 
-- ON <some condition> 
WHERE i.key3 = det.key3 AND 
     hdr.adj_no = '112' 

In Ihrer ursprünglichen Abfrage von Ihnen angegebenen nie Joinbedingungen für die Tabelle testOther, was bedeutet, dass Sie eine Kreuzverbindung dieser Tabelle durchführen. Dies sollte zwar Ihr tatsächliches Problem nicht beeinflussen, aber wenn der Cross-Join nicht beabsichtigt war, sollten Sie eine ON-Klausel hinzufügen, die diesen Join einschränkt.

Ein Grund, warum sich der größte Teil der Datenbankwelt von der impliziten Joinsyntax entfernt hat, liegt gerade darin, dass es schwierig ist, zu erkennen, was verbunden ist, und dass eine Join-Bedingung leichter übersehen wird.

+0

Hallo Tim, danke für die Hilfe, sorry ich denke, ich habe es nicht klar erwähnt, die Ergebnisse, die ich erhalten möchte, ist hdr.adj_no = 112, bedeutet, wenn in der Kopftabelle 113, 114 sind, wird es diesen Wert nicht zurückgeben. Ich werde meine Frage aktualisieren. – hades

+0

@hades Ich stehe zu meiner Antwort. Wenn Sie mit fehlenden Werten umgehen wollen, können Sie 'COALESCE' in der Spalte verwenden, die' NULL' Werte haben kann. –