2012-02-24 15 views
17

मेरे पास एक प्रश्न है, लेकिन मुझे वास्तव में यह नहीं पता कि यह कैसे पूछना है! मेरे साथ सहन करें:पोस्टग्रेस्क्ल - किसी तालिका में प्रविष्टियां कैसे प्राप्त करें जिनके पास किसी अन्य तालिका में कोई मिलान नहीं है

SELECT  sc.*, 
     scd.siteid, scd.desc_frontend 
FROM  shipping_code sc 
LEFT OUTER JOIN shipping_code_description scd 
    ON   scd.shippingid=sc.shippingid 
    AND   scd.siteid IN (SELECT siteid FROM site_international WHERE published='t') 

ऊपर व्याख्या करने के लिए, हम शिपिंग (डिलीवरी) एक तालिका में कोड "shipping_code" कहा जाता है, और, क्योंकि हम एक बहु भाषा साइट है, तो हम भाषा विवरण के लिए एक और मेज है 'code_code_description' में उन कोडों का। हमारे पास "site_international" नामक एक तालिका भी है जिसमें निम्नलिखित फ़ील्ड हैं: 'साइटिड' (साइट की आईडी - उदाहरण के लिए यूके, डीई, एफआर .. (अंग्रेजी, जर्मन, फ्रेंच। ।) और 'प्रकाशित' (बूलियन क्षेत्र, यानी साइट को लाइव या नहीं है?)

चयन करें क्वेरी ऊपर केवल उन प्रकाशित साइटों के लिए उनकी भाषा विवरण के साथ सभी शिपिंग कोड, हो जाता है।

अब, हम यह भी जानना चाहते हैं कि कौन से शिपिंग कोड में कुछ साइट्स में विवरण नहीं हैं। यदि एक शिपिंग कोड पूरी तरह से नया है, तो उस कोड के लिए 1 पंक्ति वापस आ जाएगी (बाएं बाहरी जॉइन के कारण)। 'Scd.siteid' और 'scd.desc_frontend' शून्य होगा।

हालांकि, यदि यूके (अंग्रेजी) साइट के लिए कोई विवरण मौजूद है, लेकिन एफआर और डीई के लिए विवरण मौजूद नहीं है, तो उपर्युक्त क्वेरी केवल एक पंक्ति लौटाएगी, न कि तीन पंक्तियां। मैं कैसे बता सकता हूं कि एक विशेष शिपिंग कोड के लिए डीई और एफआर विवरण गायब हैं?

1) मैं किसी भी तरह यह सब एक क्वेरी के अंदर कर सकता है:

यहाँ मेरी विकल्प हैं। एक तरीका होना चाहिए (मैंने पहले कभी यूनियन, एक्सेप्ट आदि का उपयोग नहीं किया है और मुझे यकीन नहीं है कि क्या मुझे का उपयोग करना चाहिए)।

2) या मैं बस जहां प्रकाशित = 'टी'

और इसके बाद के संस्करण मुझे सभी प्रकाशित साइटों देना होगा site_international से चयन siteid के लिए एक और क्वेरी कर सकता है। फिर, उपर्युक्त बड़ी क्वेरी के प्रत्येक परिणाम के लिए PHP (जिसका उपयोग मैं अपनी साइट को कोड करने के लिए उपयोग कर रहा हूं) का उपयोग करके, मैं जांचता हूं और देखता हूं कि कोई विवरण गुम है या नहीं। जैसे उपर्युक्त साइटिड क्वेरी 3 आईडी (यूके, डीई, एफआर) वापस कर देगी। फिर यदि किसी विशेष शिपिंग कोड के लिए केवल एक यूके पंक्ति लौटा दी जाती है, तो मुझे पता चलेगा कि डीई और एफआर गायब हैं, और मैं इसे अपने क्लाइंट को ध्वजांकित कर सकता हूं।

कृपया सलाह दें कि बेहतर विकल्प "1" मौजूद है या नहीं?

बहुत धन्यवाद!

उत्तर

37

शायद मैं आपके प्रश्न को समझ नहीं पा रहा हूं लेकिन यदि आप "किसी तालिका में प्रविष्टियां" प्राप्त करना चाहते हैं, जिसमें किसी अन्य तालिका में कोई मिलान नहीं है "तो मैं आपको एक साधारण स्निपेट दे सकता हूं।

बाएं तालिका से सभी पंक्तियों का चयन करें जो सही तालिका में नहीं हैं।

SELECT l.* 
FROM t_left l 
LEFT JOIN t_right r 
ON  r.value = l.value 
WHERE r.value IS NULL 
+0

मुझे लगता है कि मैं इसे सिर्फ एक और बाएं बाहरी जॉइन के साथ हल करने में कामयाब रहा। आपके सहयोग के लिए धन्यवाद! आपके जवाब ने मुझे कुछ अलग करने की कोशिश की क्योंकि मेरे पास अन्य बाएं शामिल हैं, इसलिए मुझे किसी भी न्यूल की जांच करने की आवश्यकता नहीं थी, लेकिन इसके बजाय मैं दोनों नल और नल को चाहता था।तो मेरी पूछताछ के लिए एक और बाएं बाहरी जॉइन ठीक काम किया! अनुलेख बाएं जुड़ने और बाएं बाहरी जुड़ने के बीच कोई अंतर? – rishijd

+3

बाएं, दाएं और पूर्ण जुड़ने वाले बाहरी जुड़ते हैं। कीवर्ड "बाहरी" आवश्यक नहीं है। –

1

मुझे लगता है कि यह वही है जो आप खोज रहे हैं। वामपंथी जुड़ने में सभी संभव शिपिंग कोड और साइट कोड जोड़े मिलते हैं, फिर यह पता चलता है कि उनमें से कौन से विवरण तालिका में कोई प्रविष्टि नहीं है। मौजूदा क्लॉज यही करता है।

SELECT  
    Shipping_Code.*, 
    Site_International.SiteID 
FROM   
    Shipping_Code 
    LEFT JOIN Site_International ON Site_International.Published = 't' 
WHERE 
    NOT EXISTS (
     SELECT 
      NULL 
     FROM 
      Shipping_Code_Description 
     WHERE 
      Shipping_Code.ShippingID = Shipping_Code_Description.ShippingID 
     AND SiteInternational.SiteID = Shipping_Code_Description.SiteID) 
संबंधित मुद्दे

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