Beitritt inner join und outer join in einer Abfrage in oracle
Ich versuche zu join-7 Tabellen in einer select-Abfrage mit vier inner join und zwei mit outer-join.
Kann ich kombinieren äußere und innere Verknüpfung in der gleichen Abfrage? Denn wenn ich das Tue, so bin ich nicht immer richtige Ergebnisse. Ich habe versucht, mit ANSI-joins ( INNER JOIN , LEFT OUTER JOIN), und mit + - Zeichen als gut. Ich Frage mich, ist die Reihenfolge der Teilnahme ist wichtig, die in ANSI-joins?
so, hier ist das Szenario,
Tabelle ein
Tabelle b
Tabelle c
Tabelle e
Tabelle f
tanle g
Tabelle h
inner join ( a , b, c )
inner join ( a , e , f)
left-outer-outer-join ( f , g)
linke äußere Verknüpfung ( f , h)
Meiner Abfrage ( die sieht falsch) _==>
FROM a inner join b on (a.col_1 = b.col_1)
inner join c on (b.y = c.y)
inner join e on ( a.col_1 = e.col_1)
inner join f on (e.col_4 = f.col_4)
left outer join g on (g.col_5= f.col_5)
left outer join h on (h.col_6 = f.col_6)
Könnte jeder eine bitte helfen Sie mir mit der richtigen Beitritt Abfrage?
Alle führen würde sehr geschätzt werden
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie immer schreiben Sie eine Abfrage mit
INNER
undOUTER JOIN
zusammen.Dein Beispiel ist nicht klar, denn es ist sehr wichtig, wenn Sie eine Abfrage schreiben, kennt Ihr Ziel.
INNER JOIN
: Verwenden Sie diesen Vorgang, wenn Sie wollen, zu extrahieren Reihen auf zwei (oder mehr) Tabellen, und für Sie ist es wichtig, das Vorhandensein dieser Daten die Werte in beiden Tabellen.OUTER JOIN
: Verwenden Sie diesen Vorgang, wenn Sie wollen, zu extrahieren Zeilen aus einer Haupt-Tabelle, unabhängig davon, ob die entsprechende Zeile stellt in der verknüpften Tabelle.Ich versuche zu machen, ein Beispiel:
Ich habe eine Tabelle (
PERSON
) mit einer Liste von Personen. Diese Tabelle hat einen Fremdschlüssel zeigen Sie eine Tabelle (COUNTRY
) wissen, Informationen über den Geburtsort. Ich habe eine weitere Tabelle (BANK_ACCOUNT
) wo Speicher ich die Bankverbindung für jede person (wenn eine person).Mein Ergebnis wissen will: alle personenbezogenen Daten (inklusive der Geburtsort name) und wenn eine person ein Bankkonto hat, kennt es.
Abfrage:
In diesem Fall sehr wichtig zu wissen, das Ziel! Über ein weiteres Ziel der oberen Abfrage falsch sein.
Über die Reihenfolge der
JOIN
: Ist nicht wichtig die Reihenfolge, aber die geben ja.INNER JOIN
: Ist kommutativ. Wenn Sie Tabellen A und B, wenn Sie schreibenOUTER JOIN
: Ist nicht kommutativ. Wenn Sie Tabelle A und Tabelle B den folgenden Abfragen werden unterschieden:Weil der erste sagt: Bekommen alle Eine Zeilen und wenn es eine entsprechende Zeile B geben Sie mir diese Informationen, statt return NULL Wert.
Die zweite Abfrage sagt: Holen Sie sich alle B-Zeilen und wenn es eine entsprechende Zeile in Einem geben Sie mir diese Informationen, statt return NULL Wert.
Einige Ihrer INNEREN Verknüpfungen (="Anforderungen") sind wohl nicht der Rückkehr nichts.
Inner join gibt nichts aus der Quell-Tabelle (ein), wenn die "join -Bedingung" kann nicht erfüllt werden. Left join gibt die Zeilen (aus Tabelle a) und füllt die verknüpften Zeilen der Spalten mit null wenn nicht gefunden. In beiden Fällen, wenn es mehrere Spiele, mehrere Zeilen werden auch zurückgegeben.
Beispiel mit einer Zeile in jeder Tabelle:
- Und unsere-Abfrage:
Also tun wir wieder alles, was?
Bereits an dieser Stelle die Abfrage nicht etwas zurückzugeben-und wir nicht-Ereignis brauchen, um zu überprüfen, Links schließt (es gibt nichts, um uns auf).
Falls f ein.col4 gewesen wäre, 6 statt 7, im Beispiel Zeile zurückgegeben werden. Dann würden wir auch an der Reihe(s) von g, wenn die Bedingung angepasst werden kann (g.col_5= f.col_5; 4 = 4 -> OK). In diesem Beispiel ausgewählten Spalten aus der Tabelle h würden alle haben den Wert null, da die Bedingung (optional 2) nicht erfüllt.
Ich hoffe, dies hilft Ihnen bei der Suche nach den Themen. Es ist wirklich schwer zu erkennen das eigentliche problem ohne gültige Daten. In der Zukunft, erwägen, zum Beispiel SQL Fiddle mit Ihren Fragen.
PS. ÄUßERE und INNERE sind optional Worte und don ' T machen einen Unterschied in der Abfrage. So LEFT OUTER JOIN ist die gleiche wie LEFT JOIN und INNER JOIN ist die gleiche wie BEITRETEN.