2011-07-07 8 views
19

मैं दो तालिकाओं जो इस तरह दिखना है:मैं दो तालिकाओं में कैसे शामिल हो सकता हूं लेकिन केवल उन पंक्तियों को वापस कर सकता हूं जो मेल नहीं खाते हैं?

T1: ID | Date | Hour | Interval 
T2: ID | Date | Hour 

मैं मूल रूप से इन तालिकाओं जब उनकी आईडी, दिनांक, और घंटे मैच में शामिल होने की जरूरत है। हालांकि, मैं केवल तालिका 1 से परिणाम है कि तालिका में परिणामों के साथ कर नहीं मैच लौटना चाहते 2.

मैं जानता हूँ कि इस सरल लगता है, लेकिन तथ्य यह है कई पंक्तियों देखते हैं कि मैं कहाँ अटक कर रहा हूँ है तालिका 1 में जो तालिका 2 के साथ मेल खाता है (किसी दिए गए घंटे के लिए कई अंतराल होते हैं)। मैं जैसा सारणी में एक ही घंटे की अवधि में नहीं आते इन अंतराल के सभी इतने लंबे समय के वापस जाने के लिए की जरूरत है 2.

उदाहरण डेटा:

T1: 1 | 1/1/2011 | 1 | 1 
    1 | 1/1/2011 | 1 | 2 
    1 | 1/1/2011 | 2 | 1 
    1 | 1/1/2011 | 2 | 2 

T2: 1 | 1/1/2011 | 1 

मेरे उम्मीद इस बात के लिए निर्धारित किए गए अंतिम दो पंक्तियों होगा परिणाम T1 से। क्या कोई मुझे सही रास्ते पर इंगित कर सकता है?

उत्तर

50
SELECT T1.* 
    FROM T1 
    WHERE NOT EXISTS(SELECT NULL 
         FROM T2 
         WHERE T1.ID = T2.ID 
          AND T1.Date = T2.Date 
          AND T1.Hour = T2.Hour) 

यह भी एक LEFT JOIN के साथ किया जा सकता है:

SELECT T1.* 
    FROM T1 
     LEFT JOIN T2 
      ON T1.ID = T2.ID 
       AND T1.Date = T2.Date 
       AND T1.Hour = T2.Hour 
    WHERE T2.ID IS NULL 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद, दोनों प्रश्न एमएस एक्सेस के साथ अच्छी तरह से काम करते हैं। ईमानदार होने के लिए, मुझे कभी नहीं पता था कि आप 'SELECT' कथन को उस तरह जोड़ सकते हैं, +1। – Breakthrough

+0

असल में, एक और प्रतिक्रिया - मैं पहले विकल्प के साथ गया, 'जहां मौजूद नहीं है' खंड। अपमानजनक, मुझे कभी नहीं पता था कि आप ऐसा कर सकते हैं, यह खूबसूरती से काम करता है। – Breakthrough

+6

ध्यान रखें कि EXISTS जेट/एसीई क्वेरी प्रोसेसर द्वारा अच्छी तरह अनुकूलित नहीं है और तुलना के दोनों तरफ इंडेक्स का उपयोग नहीं करेगा (यह भी बहुत अधिक डिग्री के लिए नहीं है)। इस प्रकार, जैसे डेटा सेट बढ़ता है, आप EXISTS संस्करण के साथ एक प्रमुख प्रदर्शन हिट देख सकते हैं। जॉइन संस्करण हमेशा सभी उपलब्ध इंडेक्स का उपयोग करेगा। –

20

उपयोग एक LEFT JOIN और लाइनों है कि गैर NULL टी 2 कॉलम को फ़िल्टर:

SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.ID = T2.ID 
    AND T1.Date = T2.Date AND T1.Hour = T2.Hour 
    WHERE T2.ID IS NULL 
+0

+1 और उत्तर के लिए धन्यवाद, लेकिन मुझे जो के साथ जाना पड़ा (उसने कुछ मिनटों का उत्तर दिया)। – Breakthrough

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

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