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

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.


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

4

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


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;

¿No utiliza la estructura de la tabla del OP?
— Istiaque Ahmed
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.