मैं आईडी का उपयोग करके कई SQL तालिकाओं में कैसे शामिल हो सकता हूं?


141

मेरे पास 4 अलग-अलग टेबल हैं जिन्हें मैं शामिल करना चाहता हूं। तालिकाएँ निम्नानुसार स्तंभों से संरचित हैं:

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

तालिका A से शुरू करके, मैं समझता हूं कि b का उपयोग करके टेबल a और c को कैसे जोड़ा जाए, क्योंकि b में उन तालिकाओं के लिए प्राथमिक कुंजी है। मैं टेबलए टेबल टेबल टेबल पर भी शामिल होना चाहता हूं। नीचे मेरा एसक्यूएल स्टेटमेंट है जो पहले टेबल ए और बी से जुड़ता है, फिर सी से जुड़ता है:

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

जब मैं डी को शामिल करने के लिए एक और जुड़ने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है कि '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
तालिका का चयन नहीं करेंगे। * कॉलम लेबल में सभी मिलान प्राथमिक कुंजी आईडी की डुप्लिकेट करें? (प्रश्न में यह निर्दिष्ट नहीं किया गया था कि आउटपुट क्या वांछित है, लेकिन आमतौर पर आप ऐसा नहीं करना चाहेंगे जो मुझे लगता है)
हीथ स्टार्क

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

आपने टेबलड में शामिल नहीं किया है, केवल dIDटेबल में से एक से TableD FIELD ( ) का चयन किया है ।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.