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

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.


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

4

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


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;

Nie używasz struktury tabeli OP ?!
Istiaque Ahmed
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.