SQL

2012-12-04 9 views
15

में दिए गए कॉलम के लिए कौन सी पंक्तियों के अलग-अलग मान हैं, यह पता लगाने के लिए कि वे एक ही आईडी से दो पते की तुलना करने की कोशिश कर रहे हैं, यह देखने के लिए कि वे मेल खाते हैं या नहीं। उदाहरण के लिए:SQL

Id Adress Code  Address 
1 1    123 Main 
1 2    123 Main 
2 1    456 Wall 
2 2    456 Wall 
3 1    789 Right 
3 2    100 Left 

मैं सिर्फ प्रत्येक आईडी मैचों के लिए पता है कि क्या यह पता लगाने की कोशिश कर रहा हूँ। इसलिए इस मामले में मैं सिर्फ आईडी 3 वापस जाने के लिए पता संहिता 1 के लिए भिन्न पता और 2.

+2

कूल! आपने क्या प्रयास किया है –

+0

कौन सा आरडीबीएमएस? यदि SQL सर्वर, [इस सवाल] को देखने का प्रयास करें (http://stackoverflow.com/q/510916/1220971)। – Bridge

+0

क्षमा करें, मैं टेराडाटा के भीतर इसका उपयोग कर रहा हूं। –

उत्तर

23

स्वयं के साथ तालिका में शामिल हों और इसे दो अलग-अलग उपनाम (ए और बी) दें। । यह एक ही तालिका के विभिन्न पंक्तियों की तुलना करने की अनुमति देता है।

SELECT DISTINCT A.Id 
FROM 
    Address A 
    INNER JOIN Address B 
     ON A.Id = B.Id AND A.[Adress Code] < B.[Adress Code] 
WHERE 
    A.Address <> B.Address 

तुलना < सुनिश्चित करता है कि आप 2 अलग-अलग पतों मिलता है और आप एक ही 2 पता कोड दो बार नहीं मिलता है "से कम"। इसके बजाए "बराबर नहीं" <> का उपयोग करके, कोड (1, 2) और (2, 1) के रूप में उपज मिलेगा; उनमें से प्रत्येक A उपनाम और B बदले में उपनाम के लिए।

शामिल खंड पंक्तियों की जोड़ी के लिए ज़िम्मेदार है जहां कहां क्लॉज अतिरिक्त स्थितियों का परीक्षण करता है।


अद्यतन:

क्वेरी के ऊपर किसी भी पते के कोड के साथ काम करता है। आप विशिष्ट पते के कोड के साथ पतों की तुलना करना चाहते हैं, तो आप

SELECT A.Id 
FROM 
    Address A 
    INNER JOIN Address B 
     ON A.Id = B.Id 
WHERE      
    A.[Adress Code] = 1 AND 
    B.[Adress Code] = 2 AND 
    A.Address <> B.Address 

करने के लिए क्वेरी को बदल सकते हैं मुझे लगता है कि यह ग्राहकों (एक उदाहरण के रूप Adress कोड = 1) एक बिलिंग पता होने लगता है उपयोगी हो सकता है से भिन्न वितरण पता (एड्रेस कोड = 2)।

+1

ग्रेट, बहुत बहुत धन्यवाद! –

+0

वाह, बहुत चालाक। दोनों उदाहरण देने के लिए धन्यवाद। – JoshYates1980

0
निजी तौर पर

होने के रूप में चाहते हैं, मैं उन्हें प्रारूप

<COL_NAME>: <COL_VAL> 

में पर्ल या पायथन का उपयोग कर एक फाइल करने के लिए प्रिंट होगा प्रत्येक पंक्ति के लिए ताकि फ़ाइल में कॉलम के रूप में कई पंक्तियां हों। तो मैं दो फ़ाइलों के बीच diff करता हूं, मानते हुए कि आप यूनिक्स पर हैं या किसी अन्य ओएस पर कुछ समकक्ष उपयोग का उपयोग करके उनकी तुलना करें। यदि आपके पास एकाधिक रिकॉर्ड्स (यानी एक से अधिक पंक्तियां) हैं, तो मैं प्रत्येक फ़ाइल पंक्ति में प्रीपेड करूंगा और फिर फ़ाइल में NUM_DB_ROWS * NUM_COLS लाइनें

+2

-1। माफ़ कीजिये।पर्ल या पायथन के साथ भिन्न होने के लिए बाहरी फ़ाइल में SQL डेटा डंप करना गलत है; "मुझे पता है कि इस हथौड़ा का उपयोग कैसे करें, तो चलो सब कुछ नाखून की तरह व्यवहार करें"। समाधान बिल्कुल पूछे गए प्रश्न को संबोधित नहीं करता है, जो इसे कैसे करना है ** एसक्यूएल ** में। –

+0

ऐसा करने के लिए एक स्क्रिप्ट लिखने का लाभ यह है कि इसे किसी भी तालिका के लिए कॉलम नाम निर्दिष्ट किए बिना काम किया जा सकता है क्योंकि उन्हें सिस्टम टेबल से पढ़ा जा सकता है। मैंने क्यूए के लिए इस तरह की कुछ स्क्रिप्ट लिखी हैं जिन्हें अलग-अलग डेटाबेस में रिकॉर्डसेट की तुलना करना था, जहां केवल एसक्यूएल पर्याप्त नहीं होगा और यहां तक ​​कि अगर ऐसा होता है, तो उन्हें अलग-अलग कॉलम को प्रतिबिंबित करने के लिए प्रत्येक अलग-अलग तालिका के लिए एक कस्टम क्वेरी लिखनी होगी। मेरी स्क्रिप्ट में एकमात्र टेबल-विशिष्ट डेटा, बेशक, तालिका विवरण जैसे नाम, स्कीमा और सर्वर, मानदंड स्ट्रिंग होगा। – amphibient

+0

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

1

आप से एक समूह का उपयोग कर ऐसा कर सकते हैं:

select id, addressCode 
from t 
group by id, addressCode 
having min(address) <> max(address) 

इस लेखन स्पष्ट लग सकता है की एक और तरीका है, लेकिन जैसा कि अच्छा प्रदर्शन नहीं करता:

select id, addressCode 
from t 
group by id, addressCode 
having count(distinct address) > 1 
3

यह PL/SQL के लिए काम करता है:

select count(*), id,address from table group by id,address having count(*)<2