2010-10-12 18 views
5

वर्तमान में 2 तालिकाओं (कुशलतापूर्वक तालिका A के लिए पंक्तियों के बहुत सारे)एसक्यूएल क्वेरी - सुनिश्चित करें एक पंक्ति()

मान्य करने के लिए एक तरह से खोजने के साथ संघर्ष कर रहा है दो तालिकाओं

तालिका A में प्रत्येक मान के लिए मौजूद है

ID 
A 
B 
C 

टेबल मिलान किया

ID Number 
A 1 
A 2 
A 9 
B 1 
B 9 
C 2 

मैं एक एसक्यूएल सर्वर क्वेरी मूल रूप से वहाँ मूल्यों की एक चर सेट के लिए एक पंक्ति मौजूद तालिका A में हर मूल्य के लिए सुनिश्चित करने के लिए जाँच करता है कि (1, 2,9) लिखने के लिए कोशिश कर रहा हूँ

उपरोक्त उदाहरण है गलत है क्योंकि टी में प्रत्येक रिकॉर्ड के लिए प्रत्येक मान के लिए मिलान तालिका में एक समान रिकॉर्ड होना चाहिए (1,2, 9)। अंतिम लक्ष्य है:

टेबल मिलान किया

ID Number 
A 1 
A 2 
A 9 
B 1 
B 2 
B 9 
C 1 
C 2 
C 9 

मैं अपने भ्रामक पता है, लेकिन (कुछ सेट) में हर एक्स के लिए सामान्य रूप में वहाँ तालिका में एक इसी रिकॉर्ड की बराबरी होना चाहिए। मैंने स्पष्ट रूप से चीजों को सरल बना दिया है।

अगर आपको सभी को स्पष्टीकरण की आवश्यकता है तो कृपया मुझे बताएं।

+0

क्या हमेशा तीन मान हैं? क्या मूल्य हमेशा 1,2, और 9 हैं? – Kuberchaun

+1

वास्तव में 17 मूल्य नहीं हैं .. और वे अनुक्रमिक नहीं हैं। (1,3,4,5 7, आदि) – Nix

उत्तर

10

उपयोग:

SELECT a.id 
    FROM TABLE_A a 
    JOIN TABLE_B b ON b.id = a.id 
    WHERE b.number IN (1, 2, 9) 
GROUP BY a.id 
    HAVING COUNT(DISTINCT b.number) = 3 

COUNT में अलग सुनिश्चित करता है कि डुप्लिकेट (आईई: एक मान "2" के साथ TABLE_B में दो रिकॉर्ड वाले) गलत तरीके से सही रिकॉर्ड नहीं माने जाने से। number कॉलम में या तो उस पर एक अद्वितीय या प्राथमिक कुंजी बाधा है, तो इसे छोड़ा जा सकता है।

HAVING COUNT(...)चाहिएIN खंड में प्रदान की मूल्यों की संख्या के बराबर।

+0

मुझे लगता है कि यह काम करेगा, बेवकूफ सरल (निराशाजनक)। अब परीक्षण धन्यवाद। – Nix

+0

@Nix: मुझे लगता है कि मैं इसे और अधिक मजबूत कर सकता हूं? :) –

+0

+1: अच्छा लग रहा है ... – RedFilter

0

अपनी इच्छित मानों की एक temp तालिका बनाएं। यदि आप मान 1, 2 और 9 कुछ तालिका में हैं, तो आप इसे गतिशील रूप से कर सकते हैं।

फिर, SELECT FROM tempTable WHERE NOT IN (SELECT * FROM TableMatched)

+0

मुझे यह सुनिश्चित करने की ज़रूरत है कि प्रत्येक पंक्ति के लिए मिलान तालिका में मौजूद सभी मान मौजूद हैं। क्या यह सिर्फ मुझे बताएगा कि मेरे पास ऐसे मूल्य हैं जो वहां नहीं हैं? – Nix

+0

यदि रिकॉर्ड्स गायब हैं तो आप क्या करना चाहते हैं? यदि मेरा वांछित रिकॉर्ड TableMatched में मौजूद है तो मेरा चयन किसी भी रिकॉर्ड को वापस नहीं करेगा। वह परीक्षा उत्तीर्ण होगा, है ना? यदि यहां रिकॉर्ड लौटाए गए हैं, तो परीक्षण विफल हो जाता है। क्या आप इस एसक्यूएल को लापता रिकॉर्ड दर्ज करना चाहते हैं? – DOK

0

मैं इस स्थिति एक समय था। मेरा समाधान इस प्रकार था।

टेबलए और टेबलमैट के अलावा, एक सारणी थी जो पंक्तियों को परिभाषित करती है जो टेबलए में प्रत्येक पंक्ति के लिए तालिकाबद्ध में मौजूद होनी चाहिए। चलिए इसे TableMatchedDomain कहते हैं।

create view TableMatchedView 
select a.ID, 
     d.Number, 
     m.OtherValues  
from TableA a 
     join TableMatchedDomain d 
     left join TableMatched m on m.ID = a.ID and m.Number = d.Number 

इस तरह, पंक्तियों लौटे हमेशा सही थे:

आवेदन तो पहुँचा एक राय यह है कि लौटे पंक्तियाँ, इस तरह नियंत्रित के माध्यम से TableMatched। यदि टेबलमैटेड से पंक्तियां गायब थीं, तो संख्याएं अभी भी लौट आईं लेकिन अन्य वैल्यूज के साथ शून्य के रूप में। यदि टेबलमैच में अतिरिक्त मूल्य थे, तो वे बिल्कुल वापस नहीं लौटे, जैसे कि वे मौजूद नहीं थे। TableMatchedDomain में पंक्तियों को बदलकर, इस व्यवहार को बहुत आसानी से नियंत्रित किया जा सकता है। यदि कोई मान TableMatchedDomain हटा दिया गया था, तो यह दृश्य से गायब हो जाएगा।यदि इसे भविष्य में फिर से जोड़ा गया था, तो संबंधित अन्य वैल्यू फिर से दिखाई देंगे जैसा कि वे पहले थे।

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

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