2012-05-22 18 views
11

मेरे पास एक तालिका के साथ एक बहुत ही भ्रमित डेटाबेस है जिसमें दो अलग-अलग तालिकाओं की आवश्यकता होती है।तालिका में दो बार शामिल हों - एक ही तालिका के दो अलग-अलग स्तंभों पर

Table1 
- id 

Table2 
- id 
- table1_id 
- table3_id_1 
- table3_id_2 

Table3 
- id 
- value 

मैं table1 से जाने के लिए और एक में शामिल होने कि मुझे दो अलग-अलग कॉलम में table3 से मूल्य वापस देना होगा क्या करने की जरूरत: यहाँ मेरी समस्या है।

table1.id | table2.id | table2.table3_id_1 | table2.table3_id_2 | X | Y 

कहाँ X और Ytable3_id_1 और table3_id_2 क्रमशः से जुड़े पंक्ति के मान रहे हैं: तो मैं कुछ इस तरह करना चाहते हैं।

संभावित रूप से उन्हें चर या कुछ बनाते हैं ताकि मैं उन्हें WHERE खंड में भी फ़िल्टर कर सकूं?

उत्तर

26
SELECT t2.table1_id 
    , t2.id   AS table2_id 
    , t2.table3_id_1 
    , t2.table3_id_2 
    , t31.value  AS x 
    , t32.value  AS y 
FROM table2 t2 
LEFT JOIN table3 t31 ON t31.id = t2.table3_id_1 
LEFT JOIN table3 t32 ON t32.id = t2.table3_id_2; 

table1 में शामिल होने के लिए कोई जरूरत नहीं है। table2 आपको बस इतना चाहिए - मान लीजिए कि foreign key constraint रेफरेंसियल अखंडता की गारंटी देता है (सभी t2.table1_id वास्तव में table1 में मौजूद हैं)। अन्यथा आप table1 में शामिल होना चाहते हैं, इस प्रकार table1 में मौजूद पंक्तियों का चयन कर सकते हैं।

मैं इसी प्रकार के लिए table3 दोनों उदाहरणों में शामिल होने के लिए LEFT [OUTER] JOIN (and not [INNER] JOIN) का उपयोग करता हूं: यह अस्पष्ट है कि क्या रेफरेंसियल अखंडता की गारंटी है - उत्तर दें कि कोई भी कुंजी कॉलम पूर्ण हो सकता है या नहीं। एक [INNER] JOIN परिणाम से पंक्तियां छोड़ देगा जहां कोई मिलान नहीं मिलेगा। मुझे लगता है कि आप किसी भी गायब x या y के लिए NULL मान के साथ ऐसी पंक्तियां प्रदर्शित करेंगे।

और table3.idUNIQUE होने की जरूरत है, या हम एक LEFT JOIN से कई मैचों के साथ पंक्तियों गुणा हो सकता है:

7

आप एक तालिका में कई बार शामिल होते हैं, उन्हें अलग करने के लिए उपनाम का उपयोग करें:

SELECT table1.id,table2.id,table2.table3_id_1,table2.table3_id_2,t3_1.id,t3_2.id 
FROM table1 
JOIN table2 ON table1.id=table2.table1_id 
JOIN table3 t3_1 ON table2.table3_id_1=t3_1.id 
JOIN table3 t3_2 ON table2.table3_id_2=t3_2.id 
WHERE ... t3_1.id=... AND ... t3_2.id=... 
3
select t1.id as table1_id, 
    t2.id as table2_id, 
    t2.table3_id_1, 
    t2.table3_id_2, 
    t3_1.value as X, 
    t3_2.value as Y 
from Table1 t1 
inner join Table2 t2 on t1.id = t2.table1_id 
inner join Table3 t3_1 on t2.table3_id_1 = t3_1.id 
inner join Table3 t3_2 on t2.table3_id_2 = t3_2.id 
where t3_1.value = 'some_value' 
    or t3_2.value = 'some_other_value' 
संबंधित मुद्दे