Wie kann ich mithilfe der IDs mehrere SQL-Tabellen verbinden?

141

Ich habe 4 verschiedene Tabellen, denen ich beitreten möchte. Die Tabellen sind wie folgt mit Spalten strukturiert:

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

Beginnend mit Tabelle A verstehe ich, wie man die Tabellen a und c mit b verbindet, da b die Primärschlüssel für diese Tabellen hat. Ich möchte in der Lage sein, Tabelle TableD auch auf TabelleA zu verbinden. Unten ist meine SQL-Anweisung, die zuerst die Tabellen A und B und dann die mit C verbindet:

SELECT TableA.*, TableB.*, TableC.* FROM (TableB INNER JOIN TableA
ON TableB.aID= TableA.aID)
INNER JOIN TableC ON(TableB.cID= Tablec.cID)
WHERE (DATE(TableC.date)=date(now())) 

Wenn ich versuche, einen weiteren Join hinzuzufügen, um D einzuschließen, erhalte ich die Fehlermeldung, dass 'TableD' unbekannt ist:

 SELECT TableA.*, TableB.*, TableC.*, TableD.* FROM (TableB INNER JOIN TableA
    ON TableB.aID= TableA.aID)
    INNER JOIN TableC ON(TableB.cID= Tablec.cID)
    INNER JOIN TableA ta ON(ta.dID= TableD.dID)
    WHERE (DATE(TableC.date)=date(now())) 
Sonne
quelle

Antworten:

302

Sie wollen so etwas mehr:

SELECT TableA.*, TableB.*, TableC.*, TableD.*
FROM TableA
    JOIN TableB
        ON TableB.aID = TableA.aID
    JOIN TableC
        ON TableC.cID = TableB.cID
    JOIN TableD
        ON TableD.dID = TableA.dID
WHERE DATE(TableC.date)=date(now()) 

In Ihrem Beispiel schließen Sie tatsächlich nicht ein TableD. Alles, was Sie tun müssen, ist einen weiteren Join durchzuführen, wie Sie es zuvor getan haben.

Ein Hinweis: Sie werden feststellen, dass ich viele Ihrer Klammern entfernt habe, da sie in den meisten Fällen, in denen Sie sie hatten, wirklich nicht erforderlich sind, und nur beim Versuch, den Code zu lesen, Verwirrung stiften. Die richtige Verschachtelung ist der beste Weg, um Ihren Code lesbar und getrennt zu machen.

Justin Pihony
quelle
2
wird nicht tableN auswählen. * Alle übereinstimmenden Primärschlüssel-IDs in den Spaltenbeschriftungen duplizieren? (Frage hat nicht angegeben, welche Ausgabe gewünscht wird, aber normalerweise möchten Sie dies nicht tun, denke ich)
Heather Stark
6
Darf ich fragen, warum das so JOINTableCist ON TableC.cID = TableB.cIDund nicht TableC.cID = TableA.cID? Ich nahm an, dass wir uns TableAden anderen 3 Tischen anschließen.
Emihir0
25
SELECT 
    a.nameA, /* TableA.nameA */
    d.nameD /* TableD.nameD */
FROM TableA a 
    INNER JOIN TableB b on b.aID = a.aID 
    INNER JOIN TableC c on c.cID = b.cID 
    INNER JOIN TableD d on d.dID = a.dID 
WHERE DATE(c.`date`) = CURDATE()
Nemoden
quelle
4

Sie sind TableD nicht beigetreten, sondern haben lediglich TableD FIELD ( dID) aus einer der Tabellen ausgewählt.

Chriseyre2000
quelle
2

Einfacher INNER JOIN VIEW-Code ....

CREATE VIEW room_view
AS SELECT a.*,b.*
FROM j4_booking a INNER JOIN j4_scheduling b
on a.room_id = b.room_id;
Manu RS
quelle
Verwenden Sie nicht die Tabellenstruktur des OP ?!
Istiaque Ahmed