2011-12-07 11 views
5

में मौजूद है मैं 2 टेबल है:में शामिल होने एसक्यूएल जो मुझसे कहता है यदि आईडी अन्य तालिका

A  B 
-- ---- 
ID FKID 
-- ---- 
1  3 
2  3 
3  4 
4  4 

मैं एक का चयन करें बयान जो मुझे पता चलता एक क्षेत्र है कि मुझसे कहता है के साथ एक के सभी की जरूरत है तालिका बी किसी भी आईडी है उस आईडी से मेल खाते हैं।

Desired Result 
----------- 
ID | hasB 
----------- 
1 no 
2 no  
3 yes 
4 yes 
+0

उपयोग बाहरी में शामिल होने और NVL – Randy

+0

क्या एसक्यूएल का स्वाद? –

+0

मैं पोस्टगिस – capdragon

उत्तर

10

एसक्यूएल सर्वर में यह सबसे कारगर तरीका बजाय एक OUTER JOIN कर तो DISTINCT साथ डुप्लिकेट हटाने होगा। पोस्टग्रेज़ के लिए निश्चित नहीं है, आपको योजनाओं की जांच करनी होगी।

SELECT ID, 
     CASE 
     WHEN EXISTS (SELECT * 
         FROM B 
         WHERE B.FKID = A.ID) THEN 'yes' 
     ELSE 'no' 
     END AS hasB 
FROM A 
+3

+1: सहमत है कि यह * ग्रुप बाय, डिस्टिंट की आवश्यकता से बचकर और तालिका बी में सभी डुप्लिकेट पंक्तियों को संसाधित करने की आवश्यकता नहीं है, सर्वर पर अनावश्यक भार से बचने के लिए। – MatBailie

+1

@Dems: आप किसी व्यक्ति को निर्णय लेने में सहायता करके इस समुदाय को "मूल्यवर्धित" मूल्य प्रदान करते हैं। आपकी टिप्पणियां प्रशंसनीय हैं। (+1) आप दोनों को। – capdragon

+0

@ कैपड्रैगन: मैं बट में दर्द भी कर सकता हूं, लेकिन मैं आपको वही धन्यवाद देता हूं :) – MatBailie

2
SELECT DISTINCT 
    a.ID, 
    CASE WHEN b.FKID IS NULL THEN 'no' ELSE 'yes' END AS hasB 
FROM 
    tableA a LEFT JOIN 
    tableB b ON a.ID = b.FKID 
+1

1 का उपयोग कर रहा हूं 1: कई रिश्ते आउटपुट में डुप्लिकेट का कारण बनेंगे। (ग्रुप बाय का उपयोग करें, या इसके बजाय EXISTS?) – MatBailie

+0

अच्छा बिंदु ... अपडेट किया गया। पोस्ट करने वाले पहले व्यक्ति होने के लिए –

+0

+1। – capdragon

1

कुछ इस तरह आप के लिए बाहर काम करना चाहिए क्या डीबी मंच वास्तव में है पर निर्भर करता है। एमएस एक्सेस जैसी सुंदर चीज़ पर आपको आईआईएफ के मामले को स्वैप करने की आवश्यकता हो सकती है।

select A.ID, case when B.FKID IS NULL then 'no' else 'yes' end as hasB from A left join B on A.ID = B.FKID 
+0

यह पसंद किया जा सकता है क्योंकि यह पठनीय – Oybek

+3

1 है: कई रिश्ते आउटपुट में डुप्लिकेट का कारण बनेंगे। (इसके अलावा ग्रुप बाय का उपयोग करें, या इसके बजाय EXISTS?) [@Oybek - EXISTS फॉर्म किसी भी सक्षम SQL उपयोगकर्ता को पठनीय होना चाहिए, और इससे डुप्लिकेट परिणाम होते हैं, यह गलत है, या अपूर्ण है।] – MatBailie

+0

मैं कहूंगा कि मैं ' मैं निश्चित रूप से गलत हूं - लिखने से पहले पूरी तरह से प्रश्न नहीं पढ़ रहा है। मैं EXISTS के साथ चला गया था मैंने टेबल की कई प्रकृति के लिए एक नोट किया था। –

0

चयन आईडी, "नहीं" hasB के रूप में एक जहां नहीं से

चयन आईडी "हाँ" hasB के रूप में एक जहां आईडी से (आईडी में (fkid ख से चयन))

संघ, में (ख से fkid चुनें)

+3

दो बार स्कैन स्कैन करेगा, स्कैन के दो बार की आवश्यकता के बिना बनाया जा सकता है। – MatBailie

+0

सामान्य रूप से, तालिका में सेट किए गए इंडेक्स और तालिकाओं के आयामों के आधार पर शामिल होने से बेहतर हो सकता है। –

0

निम्न क्वेरी

SELECT DISTINCT ID,IF(FKID,'yes','no') AS hasB 
FROM A LEFT JOIN B ON A.ID = B.FKID; 

का उपयोग करते हुए आप

मिलेगा
+------+------+ 
| ID | hasB | 
+------+------+ 
| 1 | no | 
| 2 | no | 
| 3 | yes | 
| 4 | yes | 
+------+------+ 
4 rows in set (0.07 sec) 
0

इनमें से किसी को क्या करना चाहिए: select distinct a.id,(case when b.fkid is null then 0 else 1 end) as hasb from tablea a left join tableb b on a.id=b.fkid

select a.id,(case when exists(select * from tableb where a.id=fkid) then 1 else 0 end) as hasb from tablea a

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

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