2011-08-24 14 views
6

में शामिल है मुझे एक दृश्य के साथ समस्या है जिसे मैं बनाना चाहता हूं। मेरे पास बाएं बाहरी जुड़ने में दो टेबल शामिल हैं, tableA और tableB कहें, जहां tableB बाहरी शामिल हो गया है।एसक्यूएल जहां बाएं बाहरी के लिए खंड

मैं केवल तालिका बी से उन पंक्तियों का चयन करना चाहता हूं जहां राज्य 4 बराबर है, इसलिए मैं अपनी क्वेरी में WHERE state = 4 जोड़ता हूं। अब परिणाम सेट को थोड़ा सा छंटनी की जाती है क्योंकि tableB में मिलान करने वाली पंक्ति के बिना सभी पंक्तियां परिणाम से हटा दी जाती हैं (क्योंकि राज्य उन पंक्तियों के लिए 4 नहीं है)। मैंने WHERE state = 4 OR state IS NULL भी कोशिश की, यह काम नहीं करता है (क्योंकि state तकनीकी रूप से NULL नहीं है जब कोई राज्य नहीं है)।

तो मुझे जो चाहिए वह WHERE कथन है जिसका मूल्यांकन केवल एक पंक्ति होने पर ही किया जाता है, क्या ऐसी चीज मौजूद है?

यदि मुझे दो विकल्प नहीं दिखते हैं: join (SELECT * FROM tableB WHERE state = 4) तालिका बी के बजाय, या उसी WHERE कथन के साथ एक दृश्य बनाएं और इसके बजाय इसमें शामिल हों। प्रदर्शन के अनुसार सबसे अच्छा विकल्प क्या है?

यह SQL सर्वर 2008 R2 वैसे है।

+1

यह बाहर काम करने की कोशिश के लिए रुचिकर होगी क्यों 'जहां राज्य = 4 या राज्य NULL', काम नहीं करता है, क्योंकि यह बाईं रोकने चाहिए है एक आंतरिक में परिवर्तित किया जा रहा शामिल होने के में शामिल हो। –

+0

@Damien_The_Unbeliever - यह आपको TableA से सभी पंक्तियों को टेबलबी में नहीं देगा, लेकिन उन पंक्तियों पर नहीं जहां टेबलए में टेबलबी का मिलान है, जहां राज्य <> 4. http://data.stackexchange.com/stackoverflow/qt/110316/ –

+0

@ Damien_The_Unbeliever: 3 राज्य हैं: राज्य = 4 के साथ मिलान, राज्य के साथ मिलान <> 4, कोई मैच – gbn

उत्तर

6

आप on खंड में शर्तों को डालते हैं। उदाहरण:

select a.this, b.that 
from TableA a 
left join TableB b on b.id = a.id and b.State = 4 
+0

आह, मुझे यह नहीं पता था! धन्यवाद! – Jasper

4

आप शामिल स्थिति में state = 4 जोड़ सकते हैं।

select * 
from T1 
    left outer join T2 
    on T1.T1ID = T2.T1ID and 
     T2.state = 4 
1

एक सबक्वायरी से भी आसान on खंड का विस्तार कर रहा है;

select * 
from TableA a 
left join 
     TableB b 
on  a.b_id = b.id 
     and b.state = 4 

TableA से सभी पंक्तियों दिखाई देगा, और केवल राज्य 4.

SQL सर्वर के साथ TableB से उन शायद दृश्य निष्पादित करेंगे, on विस्तार किया है, और बिल्कुल उसी तरह सबक्वेरी। तो प्रदर्शन के अनुसार, थोड़ा अंतर होना चाहिए।

0

वैकल्पिक दृष्टिकोण: (1) आंतरिक तालिका बी जहां राज्य पंक्तियों मौजूद नहीं है कि खोजने के लिए तालिका बी करने के लिए 4 के बराबर होती है, (2) antijoin, (3) संघ के परिणामों में शामिल होने:

SELECT A1.ID, A1.colA, B1.ColB 
    FROM tableA AS A1 
     INNER JOIN tableB AS B1 
      ON A1.ID = B1.ID 
      AND B1.state = 4 
UNION 
SELECT A1.ID, A1.colA, '{{MISSING}}' AS ColB 
    FROM tableA AS A1 
WHERE NOT EXISTS (
        SELECT * 
        FROM tableB AS B1 
        WHERE A1.ID = B1.ID 
       ); 

वैकल्पिक रूप से:

SELECT A1.ID, A1.colA, B1.ColB 
    FROM tableA AS A1 
     JOIN tableB AS B1 
      ON A1.ID = B1.ID 
      AND B1.state = 4 
UNION 
SELECT ID, colA, '{{NA}}' AS ColB 
    FROM tableA 
WHERE ID IN (
       SELECT ID 
       FROM tableA 
       EXCEPT 
       SELECT ID 
       FROM tableB 
      ); 
संबंधित मुद्दे