2012-06-04 8 views
8

तो मेरे पास तीन समस्याएं हैं जो मेरी समस्या में शामिल हैं, 2 नियमित तालिकाओं और कई के लिए एक जॉइन टेबल में कई रिश्ते हैं। वे इस तरह दिखेगा:तालिका और एकाधिक मानों में शामिल होने के लिए एसक्यूएल क्वेरी

table1 
--id 
--data 

table2 
--id 
--data 

table1_table2 
--table1_id 
--table2_id 

तो, मेरे सवाल का मैं कैसे क्वेरी कुछ table1 में एक आइटम के लिए table1_table2 में एक या अधिक मान होता है कि के लिए (एक में शामिल होने का उपयोग) होता है। उदाहरण के लिए:

Table 1 
+----------+ 
|id | data | 
+----------+ 
|1 | none | 
+----------+ 
|4 | match| 
+----------+ 

Table 2 
+----------+ 
|id | data | 
+----------+ 
|1 | one | 
+----------+ 
|2 | two | 
+----------+ 

table1_table2 
+----------------------+ 
|table1_id | table2_id | 
+----------------------+ 
|1   | 1   | 
+----------------------+ 
|4   | 1   | 
+----------------------+ 
|4   | 2   | 
+----------------------+ 

मैं एक प्रश्न है कि तालिका 1 पंक्ति आईडी 4 से मेल खाते हैं, क्योंकि यह तालिका 2. से दोनों पंक्ति 1 और 2 के लिए शामिल होने के इस कृपया कुछ भी पूछने भ्रामक है, तो के माध्यम से एक लिंक है की जरूरत है।

शायद मैं थोड़ा अस्पष्ट था, मैं table1_table2 का उपयोग एक रूप में शामिल होने के रूप में नहीं कर रहा हूं। मुझे यकीन है कि यह मेज से 1 और 2 दोनों से मेल खाता है 2.

यहाँ अब तक मेरी क्वेरी है बनाने की जरूरत है ...

SELECT DISTINCT table1.id, 
table2.data 

FROM table1 

LEFT JOIN table1_table2 ON table1.id = table1_table2.table1_id 
LEFT JOIN table2 ON table2.id = table1_table2.table2_id 

मैं एक की जरूरत है, जहां कि तालिका 1 में एक प्रविष्टि के लिए है कि कर देगा यह मैच दोनों 1 और 2 तालिका 2.

से उत्पादन मैं देख रहा हूँ होगा:

+---------------------+ 
|table1.id|table2.data| 
+---------------------+ 
|4  |one  | 
+---------------------+ 
|4  |two  | 
+---------------------+ 
+0

क्या आप एसक्यूएल सीख रहे हैं (यानी यह होमवर्क है?) यह आपके पिछले प्रश्नों में से एक के लिए एक बहुत ही स्पष्ट अनुवर्ती प्रश्न है (http://stackoverflow.com/questions/10726322/sql-join-using-a-join -table-से-रेल)। मुझे SO पर सीखने में कोई समस्या नहीं है लेकिन यदि आप हैं तो आप अपने प्रश्न [होमवर्क] को टैग करना चाहेंगे। – Tony

+0

यह स्कूल के लिए नहीं है। – Red

+0

हालांकि प्रश्न पिछले प्रश्न से संबंधित है, लेकिन यह वास्तव में एक ही सारणी का उपयोग नहीं कर रहा है। मैं उन टेबलों का नाम बदल रहा हूं जो मैं वास्तव में उपयोग कर रहा हूं। – Red

उत्तर

4

यदि आप गारंटी दे सकते हैं कि तालिका 1_Table2 तालिका में कोई डुप्लिकेट नहीं है तो निम्न दृष्टिकोण काम करता है। शायद आप यहां से शुरू कर सकते हैं और इसे थोड़ा सा कर सकते हैं। ध्यान दें कि जॉइन हालत कैसे काम करती है - इन्हें जॉइन हालत में डालकर अलग-अलग काम करता है अगर आप WHERE क्लॉज में आईएन स्थिति डालते हैं।

मैंने मानों के लिए हैश अंक का उपयोग किया है जो आपको SQL में अपना कोड डालने की आवश्यकता होगी।

SELECT Table1.id, COUNT(Table1_Table2.Table2_id) 
FROM Table1 
JOIN Table1_Table2 ON (Table1_Table2.Table1_id = Table1.id 
        AND Table1_Table2.Table2_id IN (#somelist#)) 
GROUP BY Table1.id 
HAVING COUNT(Table1_Table2.Table2_id) = (#length of somelist#) 

ओह - आपने सुझाए गए तरीके से अपना प्रश्न बदल दिया है और मैंने आपके संपादन को अनदेखा कर दिया है। लेकिन यह आपको शुरू करना चाहिए, क्योंकि यह आपकी सभी तालिका 1 आईडी को लौटाता है, जिसमें आप रुचि रखते हैं।

0

मुझे लगता है कि आप इस चयन करने के लिए सक्षम होना चाहिए:

select table1_id, count(*) as count from table1_table2 group by table1_id having count > 2; 

समूह, गिनती और आपके मित्र होने के समूह!

+0

शायद मैं थोड़ा अस्पष्ट था, मैं table1_table2 का उपयोग कर रहा हूं क्योंकि इसमें शामिल नहीं है। मुझे यह सुनिश्चित करने की ज़रूरत है कि यह दोनों 1 और 2 से मेल खाता हो। मैं इसे प्रतिबिंबित करने के लिए प्रश्न बदल दूंगा। – Red

2

मेरा समाधान यहां है। यह बहुत सामान्य नहीं है। यदि यह समाधान काम नहीं करता है तो आपको एक टिप्पणी पोस्ट करनी चाहिए क्योंकि यह आपकी स्थिति के लिए बहुत विशिष्ट है।

SELECT DISTINCT Table1.id 
FROM Table1 
INNER JOIN table1_table2 a ON (table1.id = table1_table2.table1_id 
          AND table2.id = 1) 
INNER JOIN table1_table2 b ON (table1.id = table1_table2.table1_id 
          AND table2.id = 2) 
+1

मेरा मानना ​​है कि यह काम करेगा, एकमात्र समस्या यह है कि कभी-कभी मेरे पास केवल दो मानों से अधिक हो सकता है, कभी-कभी मेरे पास 50 मान हो सकते हैं। बहुत से लोग डीबी पर काफी कठिन हो जाएंगे और गतिशील रूप से उन्हें मोटा हो जाएगा। – Red

+0

तो क्या आप तालिका 2 में कितनी चीजें हैं, इस पर ध्यान दिए बिना, सभी तालिका 1 आईडी की सूची जो प्रत्येक तालिका 2 प्रविष्टि से मेल खाती है? –

+0

ठीक है, तालिका 2 में हर चीज नहीं, लेकिन कम से कम मैंने जो कहा। उदाहरण में, मैं सिर्फ 1 और 2 से मेल खाने वाली तालिका 1 प्रविष्टियों की सूची चाहता था। हालांकि मैं (यदि वे मौजूद थे) को एक क्वेरी की आवश्यकता होती है जो तालिका 1 के बाहर 1, 2, 3, और 7 से मेल खाने वाली सभी तालिका 1 प्रविष्टियों को प्राप्त करती है मुझे यह सुनिश्चित करने की ज़रूरत है कि यह उन सभी से मेल खाती है। – Red

1

यदि मैं SQL सर्वर में ऐसा कर रहा था तो मैं उन मानों को डालूंगा जिन्हें आप एक temp तालिका (या तालिका चर) में जांचना चाहते हैं। और उसके बाद @ChrisCunningham ने कहा कि एक भिन्नता का उपयोग करें।

CREATE TABLE #temp (Id INT) 
INSERT INTO #temp 
VALUES (1, 3, 7) 

SELECT a.id AS table1ID, table2.data 
FROM 
(
     SELECT Table1.id, Table1_Table2.table2_id 
    FROM Table1 JOIN Table1_Table2 
     ON (Table1_Table2.Table1_id = Table1.id      
    AND Table1_Table2.Table2_id IN (SELECT Id FROM #temp)) 
    GROUP BY Table1.id 
    HAVING COUNT(Table1_Table2.Table2_id) = (SELECT count (*) FROM #temp) 
    ) a 
JOIN Table2 ON Table2.id = a.Table2_id 
बेशक

मुझे यकीन है कि क्या तंत्र Postgre अस्थायी तालिकाओं के लिए है नहीं कर रहा हूँ, लेकिन आप भी यह एक संग्रहीत proc जहां विभाजन समारोह के कुछ प्रकार का उपयोग नहीं बल्कि कि अस्थायी तालिका के लिए मान बनाने के लिए होगा जिस तरह से मैंने किया। लेकिन कम से कम यह आपको एक विचार दे सकता है।

संबंधित मुद्दे