Як я можу приєднати декілька таблиць SQL за допомогою ідентифікаторів?


141

У мене є 4 різних таблиці, до яких я хочу приєднатися. Таблиці структуровані стовпцями так:

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

Починаючи з таблиці A, я розумію, як об’єднати таблиці a і c за допомогою b, оскільки b має первинні ключі для цих таблиць. Я хочу мати можливість приєднатись до таблиці TableD і на TableA. Нижче моє твердження SQL, яке спочатку приєднується до таблиць A і B, а потім приєднується до 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())) 

Коли я намагаюся додати ще одне з'єднання, щоб включити D, я отримую помилку про те, що "TableD" невідомо:

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

Відповіді:


303

Ви хочете щось подібне:

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

У вашому прикладі ви насправді не включаєте TableD . Все, що вам потрібно зробити, це виконати ще одне приєднання, як і раніше.

Примітка: ви помітите, що я видалив багато ваших дужок, оскільки вони дійсно не потрібні у більшості випадків, коли ви їх мали, і додайте плутанину лише при спробі прочитати код. Правильне вкладання - найкращий спосіб зробити свій код читабельним і відокремленим.


2
не вибере tableN. * дублювати всі відповідні ідентифікатори первинного ключа у мітках стовпців? (питання не вказувало, який вихід бажаний, але, як правило, ви б не хотіли цього робити)
Хезер Старк,

6
Можливо, я запитаю, чому JOINTableCце так, ON TableC.cID = TableB.cIDа ні TableC.cID = TableA.cID. Я припускав, що ми приєднуємось TableAдо інших 3-х таблиць.
еміхір0

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

Ви не приєдналися до TableD, просто вибрали поле TableD FIELD ( dID) з однієї з таблиць.


2

Простий код ВНУТРІШНЬОГО ПРИЄДНАННЯ ...

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

Не використовуєте структуру таблиці ОП ?!
Істіак Ахмед
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.