¿Cómo puedo unir varias tablas SQL usando las ID?

141

Tengo 4 tablas diferentes a las que quiero unirme. Las tablas están estructuradas con columnas de la siguiente manera:

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

Comenzando con la Tabla A, entiendo cómo UNIR las tablas ayc usando b, ya que b tiene las Claves principales para esas tablas. Quiero poder unirme a la tabla TableD en TableA también. A continuación se muestra mi declaración SQL que primero une las tablas A y B, luego las une 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())) 

Cuando intento agregar otra unión, para incluir D, recibo un error de que 'TableD' es desconocido:

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

Respuestas:

303

Quieres algo más como esto:

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

En su ejemplo, en realidad no está incluido TableD. Todo lo que tiene que hacer es realizar otra unión tal como lo hizo antes.

Una nota: notará que eliminé muchos de sus paréntesis, ya que realmente no son necesarios en la mayoría de los casos que los tuvo, y solo agregará confusión al intentar leer el código. La anidación adecuada es la mejor manera de hacer que su código sea legible y separado.

Justin Pihony
fuente
2
no seleccionará tableN. * ¿duplicará todas las ID de clave principal coincidentes en las etiquetas de columna? (la pregunta no especificó qué salida se desea, pero por lo general no querría hacer esto, creo)
Heather Stark
66
¿Puedo preguntar por qué JOINTableCes ON TableC.cID = TableB.cIDy no TableC.cID = TableA.cID? Asumí que nos unimos TableAa las otras 3 mesas.
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
fuente
4

No se ha unido a TableD, simplemente ha seleccionado TableD FIELD ( dID) de una de las tablas.

Chriseyre2000
fuente
2

Código simple VISTA INTERIOR DE LA UNIÓN ...

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
fuente
¿No utiliza la estructura de la tabla del OP?
Istiaque Ahmed