Jak mogę dołączyć do wielu tabel SQL za pomocą identyfikatorów?

141

Mam 4 różne stoły, do których chcę dołączyć. Tabele mają następującą strukturę kolumn:

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

Zaczynając od tabeli A, rozumiem, jak ŁĄCZYĆ tabele a i c za pomocą b, ponieważ b ma klucze podstawowe dla tych tabel. Chcę mieć możliwość dołączenia do tabeli TableD również na TableA. Poniżej znajduje się moja instrukcja SQL, która najpierw łączy tabele A i B, a następnie łączy je z C:

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())) 

Kiedy próbuję dodać kolejne sprzężenie, aby uwzględnić D, pojawia się błąd, że „TableD” jest nieznane:

 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())) 
Słońce
źródło

Odpowiedzi:

302

Chcesz czegoś więcej takiego:

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()) 

W swoim przykładzie tak naprawdę nie uwzględniasz TableD. Wszystko, co musisz zrobić, to wykonać kolejne połączenie, tak jak robiłeś to wcześniej.

Uwaga: zauważysz, że usunąłem wiele twoich nawiasów, ponieważ naprawdę nie są one potrzebne w większości przypadków, w których je masz, i tylko dodają zamieszania podczas próby odczytania kodu. Prawidłowe zagnieżdżanie to najlepszy sposób, aby kod był czytelny i oddzielony.

Justin Pihony
źródło
2
nie wybierze tabeliN. * zduplikować wszystkie zgodne identyfikatory klucza podstawowego w etykietach kolumn? (pytanie nie określało, jakie wyjście jest pożądane, ale myślę, że zwykle nie chcesz tego robić)
Heather Stark
6
Mogę zapytać, dlaczego tak JOINTableCjest, ON TableC.cID = TableB.cIDa nie TableC.cID = TableA.cID. Zakładałem, że dołączamy TableAdo pozostałych 3 stołów.
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
źródło
4

Nie dołączyłeś do TableD, po prostu wybrałeś TableD FIELD ( dID) z jednej z tabel.

Chriseyre2000
źródło
2

Prosty kod INNER JOIN VIEW ....

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
źródło
Nie używasz struktury tabeli OP ?!
Istiaque Ahmed