Kimlikleri kullanarak birden çok SQL tablosuna nasıl katılabilirim?


141

Katılmak istediğim 4 farklı masam var. Tablolar aşağıdaki gibi sütunlarla yapılandırılmıştır:

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

Tablo A'dan başlayarak, b'nin bu tablolar için Birincil Anahtarları olduğundan, a ve c tablolarını b kullanarak nasıl birleştireceğinizi anlıyorum. TableA'da Table TableD'ye de katılabilmek istiyorum. Aşağıda, önce A ve B tablolarına, sonra da C'ye katılan SQL ifadem aşağıdadır:

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 eklemek için başka bir birleştirme eklemek çalıştığınızda, 'TableD' bilinmeyen bir hata alıyorum:

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

Yanıtlar:


303

Daha böyle bir şey istiyorsun:

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

Örneğinizde, aslında dahil değilsiniz TableD. Tek yapmanız gereken, daha önce yaptığınız gibi başka bir birleştirme yapmak.

Not: Parantezlerinizin çoğunu kaldırdığımı fark edeceksiniz, çünkü sahip olduğunuz çoğu durumda gerçekten gerekli değildirler ve yalnızca kodu okumaya çalışırken karışıklık eklerler. Doğru yuvalama, kodunuzu okunabilir ve ayrıştırmanın en iyi yoludur.


2
tableN'yi seçmez. * sütun etiketlerinde eşleşen tüm birincil anahtar kimliklerini çoğaltır mı? (soru hangi çıktının istendiğini belirtmedi ancak genellikle bunu yapmak istemezsiniz)
Heather Stark

6
Neden sorabilir miyim JOINTableColduğunu ON TableC.cID = TableB.cIDve değil TableC.cID = TableA.cID. TableADiğer 3 tabloya katıldığımızı varsaydım .
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

TableD'ye katılmadınız, yalnızca dIDtablolardan birinden TableD ALANI'nı ( ) seçtiniz .


2

Basit İÇ KATILAN GÖRÜNÜM kodu ....

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

OP'nin tablo yapısını kullanmıyor musunuz?!
Istiaque Ahmed
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.