2011-03-27 13 views
28

मैं वास्तव में टेबल पर एक SQL क्वेरी के साथ कुछ मदद की सराहना करता हूं। मुझे एहसास है कि इस तरह की चीज लगातार पूछी जाती है, लेकिन मुझे जवाबों को समझने के लिए एक समान सवाल नहीं मिल रहा है।एसक्यूएल: किसी तालिका मिलान मानदंड से दूसरे में चुनें?

मैं table_A से पंक्तियों का चयन करना चाहता हूं जिनके पास table_B में संबंधित टैग है।
तो, उदाहरण के लिए, "table_a से पंक्तियों का चयन करें जिन्हें 'कुर्सी' टैग किया गया है table_C लौटाएगा।

इसके अलावा, idtable_a में अद्वितीय है, और table_b में नहीं है।

table_A:    table_B:     table_C: 

id object   id tag     id object 
1  lamp   1  furniture   3  stool 
2  table   2  furniture   4  bench 
3  stool   3  furniture 
4  bench   4  furniture 
        4  chair 
        3  chair 

वैकल्पिक रूप से, डेटा व्यवस्थित करने का एक बेहतर तरीका है?

select 
    A.* 
from 
    table_A A 
where 
    A.id in (
     select B.id from table_B B where B.tag = 'chair' 
) 

वैकल्पिक रूप से आप टेबल शामिल हो सकते हैं और पंक्तियों आप चाहते हैं को फ़िल्टर:

select 
    A.* 
from 
    table_A A 
inner join table_B B 
    on A.id = B.id 
where 
    B.tag = 'chair' 

आप दोनों प्रोफ़ाइल चाहिए और

उत्तर

63

सरल समाधान एक उप चयन सहसंबद्ध किया जाएगा देखें कि आपके डेटासेट पर कौन सा तेज़ है।

+0

@ rjschnorenberg का सुझाव बेहतर है यदि आपके पास स्कीमा बदलने की लक्जरी है। इस मामले में आप तीन टेबल आइटम आइटम <> आइटम_Tags <> टैग में शामिल होंगे, जिसमें दो इनर जॉइन क्लॉज का उपयोग किया जाता है। –

+0

ग्रेट, यह बहुत उपयोगी है। मुझे पता नहीं था कि आप उस तरह की तालिका से कॉलम फ़िल्टर कर सकते हैं। –

+0

दरअसल आप एआईडी = बीआईडी ​​और बीटीएजी = 'कुर्सी' पर "आंतरिक शामिल टेबल_B बी" के रूप में जुड़ने वाली लाइन भी लिख सकते हैं, लेकिन मैं कहां फ़िल्टर करता हूं। –

2
select a.id, a.object 
from table_A a 
inner join table_B b on a.id=b.id 
where b.tag = 'chair'; 
7

आपको टैगिंग टेबल के साथ टैग अपनी स्वयं की तालिका बनाना चाहिए।

items: 
id object 
1  lamp 
2  table 
3  stool 
4  bench 

tags: 
id  tag 
1  furniture 
2  chair 

items_tags: 
item_id tag_id 
1  1 
2  1 
3  1 
4  1 
3  2 
4  2 
+0

यह बेहतर जवाब है कि आपके पास स्कीमा पर नियंत्रण है। यदि आप नहीं करते हैं, तो एक दृश्य बनाने पर विचार करें जो दो ऑब्जेक्ट टेबल को यूनियन करता है ताकि आप यह कर सकें जो यह उत्तर सुझाता है। –

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