लेफ्ट जॉइन करने से पहले फ़िल्टर टेबल


82

मेरे पास 2 टेबल हैं, मैं 1 टेबल को फ़िल्टर करना चाहता हूं इससे पहले कि 2 टेबल एक साथ जुड़ जाएं।

ग्राहक तालिका:

   ╔══════════╦═══════╗
   ║ Customer ║ State ║
   ╠══════════╬═══════╣
   ║ A        ║ S     ║
   ║ B        ║ V     ║
   ║ C        ║ L     ║
   ╚══════════╩═══════╝

प्रवेश तालिका:

   ╔══════════╦═══════╦══════════╗
   ║ Customer ║ Entry ║ Category ║
   ╠══════════╬═══════╬══════════╣
   ║ A        ║  5575 ║ D        ║
   ║ A        ║  6532 ║ C        ║
   ║ A        ║  3215 ║ D        ║
   ║ A        ║  5645 ║ M        ║
   ║ B        ║  3331 ║ A        ║
   ║ B        ║  4445 ║ D        ║
   ╚══════════╩═══════╩══════════╝

मैं लेफ्ट जॉइन करना चाहता हूं इसलिए मुझे ग्राहक तालिका से सभी रिकॉर्ड मिलते हैं चाहे एंट्री टेबल में संबंधित रिकॉर्ड हो। हालांकि मैं शामिल होने से पहले प्रवेश तालिका में श्रेणी डी पर फ़िल्टर करना चाहता हूं ।

वांछित परिणाम:

   ╔══════════╦═══════╦═══════╗
   ║ Customer ║ State ║ Entry ║
   ╠══════════╬═══════╬═══════╣
   ║ A        ║ S     ║  5575 ║
   ║ A        ║ S     ║  3215 ║
   ║ B        ║ V     ║  4445 ║
   ║ C        ║ L     ║  NULL ║
   ╚══════════╩═══════╩═══════╝

अगर मुझे निम्नलिखित प्रश्न करना था:

   SELECT Customer.Customer, Customer.State, Entry.Entry
   FROM Customer
   LEFT JOIN Entry
   ON Customer.Customer=Entry.Customer
   WHERE Entry.Category='D'

यह पिछले रिकॉर्ड को छान देगा।

इसलिए मुझे बाईं तालिका से सभी पंक्तियाँ चाहिए और श्रेणी D पर फ़िल्टर की गई प्रविष्टि तालिका में शामिल हो जाना चाहिए।

अग्रिम में किसी भी मदद के लिए धन्यवाद !!


इस लिंक को देखें - sqlbenjamin.wordpress.com/2017/12/23/…
MasterJoe

जवाबों:


115

आपको WHEREफ़िल्टर को JOINस्थिति में ले जाने की आवश्यकता है :

SELECT c.Customer, c.State, e.Entry
FROM Customer c
LEFT JOIN Entry e
   ON c.Customer=e.Customer
   AND e.Category='D'

SQL फिडेल को डेमो के साथ देखें


1
वाह आप त्वरित और कुशल हैं! यह चाल है, मदद के लिए धन्यवाद!
टॉम जेनकिन

8
@TomJenkin धन्यवाद, वैसे आपने साइट पर एक शानदार पहला सवाल पोस्ट किया है। विवरण का एक बहुत, आदि
टैरिन

धन्यवाद - मुझे लगता है कि मैं इस साइट का उपयोग करने का आनंद लेने जा रहा हूं, उम्मीद है कि मैं एक दिन अपने आप को योगदान करने में सक्षम हो
जाऊंगा

2
@bluefeet लेकिन दोनों निष्पादन योजनाएं समान हैं, क्या वे नहीं हैं?
एलेक्स

1
किसी तालिका पर फ़िल्टरिंग को लागू करने के लिए, जिसमें शामिल होने से पहले निर्भर करता है कि क्या स्थितियाँ पहले तालिका को इंगित करती हैं। कम से कम मेरे कुछ परीक्षणों पर मैंने देखा। मैंने एलेक्स की टिप्पणी के जवाब में वह टिप्पणी पोस्ट की।
17एक्सल कोस्टास पेना जूल

28

आप भी कर सकते हैं:

SELECT c.Customer, c.State, e.Entry
FROM Customer AS c
LEFT JOIN (SELECT * FROM Entry WHERE Category='D') AS e
ON c.Customer=e.Customer

यहां एसक्यूएल फिडल


3
@TomJenkin देर से प्रतिक्रिया के लिए क्षमा करें, मैं इस पूरे समय कंप्यूटर से दूर रहा। जिज्ञासा से बाहर, हालांकि, मैंने इन दोनों को चलाया और निष्पादन योजनाओं की जांच की। निष्पादन योजनाएं लगभग समान हैं, लेकिन या तो हद तक बेहतर है, ऐसा प्रतीत होता है कि यह ब्लूफेट का संस्करण है।
जेफ़ रोसेनबर्ग

महान ने मुझे मेरे मामले को ठीक करने के लिए प्रेरित किया।
सिवनी

1

या ...

SELECT c.Customer, c.State, e.Entry
FROM Customer c
LEFT JOIN Entry e
   ON c.Customer=e.Customer
WHERE e.Category IS NULL or e.Category='D'

SQL JOIN स्थिति में WHERE से पहले निष्पादित किया जाता है। तो सुझाए गए समाधान में, पूरी तालिका शामिल हो गई है और परिणाम फ़िल्टर किया गया है - जो बड़ी तालिकाओं के साथ काम करते समय काफी महंगा हो सकता है। इरादा फ़िल्टर स्थिति JOIN स्थिति का हिस्सा होनी चाहिए, जैसे कि अन्य उत्तरों में सुझाया गया है
Omley

@ मुझे लगता है कि आप उलझन में हैं कि SQL कैसे काम करता है। एसक्यूएल घोषणात्मक है , प्रक्रियात्मक नहीं हैशब्दों का आदेश क्वेरी में पर कोई प्रभाव नहीं आपरेशन के आदेश । वह इंजन तक है। हम एक साधारण से देख सकते हैं EXPLAINकि MySql वास्तव में Taryn के उत्तर की तुलना में इस क्वेरी को अनुकूलित करने में बहुत बेहतर करता है, हालांकि यह निश्चित रूप से प्रबंधन की तुलना में अधिक भाग्यशाली होगा और रिवर्स दूसरे इंजन के लिए अच्छी तरह से सही हो सकता है।
cz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.