2010-10-28 12 views
27

किसी की मदद कर सकते हैं मुझे इस तरह एक scernerio के लिए एसक्यूएल लिखें:सामने से जुड़ें क्वेरी

Table 1 

2 columns: ID, Name 

Table 2 

2 columns: ID, Name 

मैं चाहता हूँ तालिका 1 से ऐसे नाम हैं जो तालिका 2 में नहीं हैं दिखाने के लिए एक प्रश्न तो सभी को फ़िल्टर तालिका 2 में तालिका 1 में नाम परिणाम क्वेरी है। फ़िल्टरिंग नाम के लिए आईडी का उपयोग करें।

यह मेरी मदद करेगा जो मैं करने की कोशिश कर रहा हूं। अग्रिम धन्यवाद

+0

निक, नीचे दिए गए सभी सुझाव (जो लोग शामिल हैं और नल की जांच कर रहे हैं और जो इन्हें नोट इन क्लॉज का उपयोग करने का सुझाव दे रहे हैं) काम करेंगे। हालांकि, अगर गति एक मुद्दा है, तो मेरा मानना ​​है कि नहीं धीमा है। यदि गति कोई मुद्दा नहीं है, तो NOT IN शायद स्पष्ट है। – Matt

+0

एक अंदरूनी जॉइन के विपरीत एक बाहरी जॉइन है और यह दो स्वादों में आता है: बाएं और दाएं जॉइन के किनारे के आधार पर आप "बाहरी" –

+1

@ मैट चाहते हैं: आपकी धारणा गलत है, 'नहीं' तेज़ी से है । – Quassnoi

उत्तर

43
Select * from table1 
left join table2 on table1.id = table2.id 
where table2.id is null 
+1

EXISTS बहुत तेज़ नहीं है। https://github.com/ebergstedt/sql_performance_left_outer_join_null_vs_not_exists –

16

इस क्वेरी

select 
t1.* 
from table1 t1 
left outer join table2 t2 
on t1.id=t2.id 
where t2.id is null 

इस जो कुछ t2 में मौजूद करने के लिए t1 में सब कुछ में शामिल होने से काम करता है का उपयोग करें। जहां क्लॉज उन सभी रिकॉर्ड्स को फ़िल्टर करता है जो टी 2 में मौजूद नहीं हैं।

3
SELECT Table1.ID, Table1.Name, Table2.ID 
FROM Table1 LEFT OUTER JOIN Table2 ON Table1.ID = Table2.ID 
WHERE Table2.ID IS NULL 

मुझे लगता है कि इसे करना चाहिए।

20

यह left join...is null संस्करण से बेहतर प्रदर्शन करना चाहिए। तुलना के लिए here और here देखें।

select t1.id, t1.name 
    from table1 t1 
    where not exists(select null from table2 t2 where t2.id = t1.id) 
+0

प्रदर्शन जुर्माना –

+0

@Eduardo Cuomo: SQL सर्वर में नहीं। –

+0

मैं इसे SQL सर्वर और 500.000 रिकॉर्ड पर परीक्षण करता हूं। 3 सेकंड बनाम 15 सेकंड ... –