2017-01-16 4 views
0

Dies ist keine Frage, auf die ich eine direkte Antwort brauche, ich muss nur wissen, wie, aus einer philosophischen Sicht, wie viele Tische ich beitreten müsste.Beitritt zu drei Tabellen Erläuterung

Sagen, ich habe 3 Tabellen:

TableA : 
Account_Number | Name | Address 

TableB : 
Account_Number | Occupation | Salary 

TableC : 
Account_Number | Model | Make 

Diese Tabellen alle eine Spalte gemeinsam haben. Wenn ich diese Tabellen zusammenführen würde, um die Spalten in jeder Tabelle mit einer übereinstimmenden Kontonummer zu erhalten, würde ich einen inneren Join ausführen, um nur Datensätze zurückzugeben, die übereinstimmen.

in der Abfrage, würde ich so etwas wie:

SELECT T1.Name, T1.Address, T2.Occupation, T2.Salary, T3.Model, T3.Make 
FROM TableA T1 
INNER JOIN TableB T2 ON T1.Account_Number=T2.Account_Number 
INNER JOIN TableC T3 ON T2.Account_Number=T3.Account_Number /Do I need to join T3 to T1 or is this handled by having T1 and T2 joined together? 
WHERE ??.AccountNumber=1234123412341234 /Would any Table work in the WHERE clause here since we are all looking for the same account_number in each table? 

Antwort

0
SELECT T1.Name, T1.Address, T2.Occupation, T2.Salary, T3.Model, T3.Make 
    FROM TableA T1 
    INNER JOIN TableB T2 ON T1.Account_Number=T2.Account_Number 
INNER JOIN TableC T3 ON T2.Account_Number=T3.Account_Number /Do I need to  join T3 to T1 or is this handled by having T1 and T2 joined together? 
WHERE T1.AccountNumber=1234123412341234 

Inner beitreten werden nur Datensätze zurück, die in der Tabelle vorhanden sind Sie beitreten. Also in Ihrem Ihre Verwendung TableA wählen so in where-Klausel Sie T1.AccountNumber

Für weitere Informationen schauen Sie bitte auf diesen Link http://www.sql-join.com/

0

Es gibt ein paar Dinge zu beachten, in Bezug auf Ihr Datenmodell verwenden sollten. Zum Beispiel

o Was ist die Beziehung zwischen diesen Tabellen? Ist dort eines? Ist die Tatsache, dass es eine Spalte Account_Number gibt, nur ein Zufall? o Angenommen, es gibt eine Beziehung, was ist die Kardinalität? Für jede gegebene Zeile in Tabelle A beispielsweise, wie viele entsprechende Zeilen in Tabelle B vorhanden sind; 0, 1 oder mehr als eins. Ähnlich von Tabelle B zu Tabelle A; und ähnlich zwischen den Tabellen B und C. o. dgl. Abhängig von der Bedeutung dieser Beziehungen könnten Sie sich in einer Situation befinden, die als "Fanfalle" bezeichnet wird. Dies ist eine Situation, in der Sie Beziehungen auffächern:

 B 
    /\ 
    / \ 
    A  C 

Es ist einfacher, mit einem Beispiel zu beschreiben.

Lassen Sie uns sagen:

A ist eine Tabelle der Vertriebsmitarbeiter B eine Tabelle von Branchen ist C eine Tabelle von Konten

ist

So hat jeder Vertriebsmitarbeiter in einer Branche arbeitet (Mächtigkeit = 1), und jeder Zweig hat 1 oder mehr Vertriebsmitarbeiter (Mächtigkeit = Many) jeder Zweig viele Accounts übernimmt, und jedes Konto ist an einem Ast gehalten

Dies ist ein absolut gültiges Datenmodell

Wenn Sie jedoch aus diesem Datenmodell herausfinden möchten, welcher Vertriebsmitarbeiter welches Konto bearbeitet, können Sie dies nicht tun. Dies ist die sogenannte Fanfalle. In diesem speziellen Beispiel würden Sie dies wahrscheinlich dadurch lösen, dass Sie eine direkte Beziehung zwischen Sales Rep und Accounts haben. obwohl es vielleicht überflüssig aussieht.

Also ich weiß, das ist eine lange Antwort auf Ihre Frage, aber es baut auf die kurze Antwort, die ist :)

0

BobC „Es kommt darauf an“ Recht über Semantik, es hängt davon ab.

Syntaktisch ist Ihr Beispiel völlig richtig und wie ich es auch tun würde. Das Verbinden gilt nur für 2 Objekte/Ergebnismengen und beide müssen sich in der Bedingung befinden, wenn Sie keine Kreuzverbindung wünschen.Außerdem spielt es keine Rolle, welche der identischen # Account-Spalten aus dem ersten Join, den Sie im zweiten Join verwenden, ist.

Wie für die WHERE-Bedingung, wenn nur eine der Tabellen einen Index oder Partitionsschlüssel hat, verwenden Sie diesen. Verwenden Sie andernfalls die Tabelle, in der die WHERE-Anweisung die wenigsten Zeilen enthält.

Joining profitiert oft davon, mit den kleinsten Tabellen/Resultsets zu beginnen. Obwohl Oracle Ihre Aussage unter Berücksichtigung der gesammelten Statistiken trotzdem optimieren wird.