Come posso unire più tabelle SQL usando gli ID?


141

Ho 4 tavoli diversi a cui voglio unirmi. Le tabelle sono strutturate con colonne come segue:

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

A partire dalla tabella A, capisco come UNIRE le tabelle a e c usando b, poiché b ha le chiavi primarie per quelle tabelle. Voglio essere in grado di unire anche TableD su TableA. Di seguito è la mia istruzione SQL che unisce prima le tabelle A e B, quindi unisce a 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())) 

Quando provo ad aggiungere un altro join, per includere D, viene visualizzato un errore che "TableD" è sconosciuto:

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

Risposte:


303

Vuoi qualcosa di più simile a questo:

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

Nel tuo esempio, non stai effettivamente includendo TableD. Tutto quello che devi fare è eseguire un altro join, proprio come hai fatto prima.

Nota: noterai che ho rimosso molte delle tue parentesi, dato che in realtà non sono necessarie nella maggior parte dei casi che hai avuto e aggiungo confusione solo quando provi a leggere il codice. L'annidamento corretto è il modo migliore per rendere il codice leggibile e separato.


2
non selezionerà la tabella N. * duplicare tutti gli ID chiave primaria corrispondenti nelle etichette delle colonne? (la domanda non specifica quale output è desiderato, ma di solito non vorresti farlo, penso)
Heather Stark,

6
Potrei chiederti perché lo JOINTableCè ON TableC.cID = TableB.cIDe non TableC.cID = TableA.cID. Ho pensato che ci stiamo unendo TableAalle altre 3 tabelle.
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

Non hai aderito a TableD, hai semplicemente selezionato TableD FIELD ( dID) da una delle tabelle.


2

Codice VISTA ISCRIVITI INTERNO semplice ....

CREATE VIEW room_view
AS SELECT a.*,b.*
FROM j4_booking a INNER JOIN j4_scheduling b
on a.room_id = b.room_id;

Non stai usando la struttura della tabella dell'OP ?!
Istiaque Ahmed,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.