2010-09-10 17 views
7

मैं एक क्वेरी बनाने का प्रयास कर रहा हूं जो किसी तालिका में सभी गैर डुप्लिकेट (अद्वितीय) रिकॉर्ड लौटाएगा। यह निर्धारित करने के लिए कि क्या दस्तावेज़ डुप्लिकेट हैं, क्वेरी को एकाधिक फ़ील्ड का उपयोग करने की आवश्यकता होगी।गैर डुप्लिकेट रिकॉर्ड के लिए SQL क्वेरी

उदाहरण के लिए, यदि किसी तालिका में निम्नलिखित फ़ील्ड हैं; पीकेआईडी, क्लाइंटिड, नाम, एक्टोनो, ऑर्डरडेट, चार्ज, मैं अद्वितीय रिकॉर्ड खोजने के लिए एक्टोनो, ऑर्डरडेट और चार्ज फ़ील्ड्स का उपयोग करना चाहता हूं।

टेबल

PKID-----ClientID-----Name-----AcctNo-----OrderDate-----Charge 
1  JX100  John  12345  9/9/2010  $100.00 
2  JX220  Mark  55567  9/9/2010  $23.00 
3  JX690  Matt  89899  9/9/2010  $218.00 
4  JX100  John  12345  9/9/2010  $100.00 

क्वेरी के परिणाम की आवश्यकता होगी होने के लिए:

PKID-----ClientID-----Name-----AcctNo-----OrderDate-----Charge 
2  JX220  Mark  55567  9/9/2010  $23.00 
3  JX690  Matt  89899  9/9/2010  $218.00 

मैं चयन DISTINCT उपयोग करने की कोशिश की है, लेकिन वह काम नहीं करता, क्योंकि यह दो प्रतियों में से एक रहता है परिणाम में रिकॉर्ड। मैंने HAVING COUNT = 1 का उपयोग करने का भी प्रयास किया है, लेकिन यह सभी रिकॉर्ड देता है।

सहायता के लिए धन्यवाद।

उत्तर

8

HAVING COUNT(*) = 1 काम करेगा यदि आप केवल GROUP BY में फ़ील्ड शामिल करते हैं जिनका उपयोग आप अद्वितीय रिकॉर्ड ढूंढने के लिए कर रहे हैं। (यानी नहीं PKID, लेकिन आप MAX या MIN उपयोग कर सकते हैं कि वापस जाने के लिए जब से तुम केवल सेट परिणामों में समूह में एक रिकॉर्ड होगा।)

+0

ठीक बिना, मैं फिर से COUNT = 1 का उपयोग कर क्वेरी भाग गया और यह काम किया ! किसी कारण से जब मैंने इसे पहले चलाया, तो उसने सभी रिकॉर्ड वापस कर दिए। इसे सही दिशा के लिए धन्यवाद। – nth

+0

बढ़िया, खुशी है कि आप इसे काम कर रहे हैं! – heisenberg

4
SELECT MAX(PKID)  AS PKID , 
     MAX(ClientID) AS ClientID, 
     MAX(Name)  AS Name , 
     AcctNo     , 
     OrderDate    , 
     Charge 
FROM  T 
GROUP BY AcctNo , 
     OrderDate, 
     Charge 
HAVING COUNT(*) = 1 

या

SELECT PKID  , 
     ClientID , 
     Name  , 
     AcctNo , 
     OrderDate , 
     Charge 
FROM YourTable t1 
WHERE NOT EXISTS 
     (SELECT * 
     FROM YourTable t2 
     WHERE t1.PKID  <> t2.PKID 
     AND  t1.AcctNo = t2.AcctNo 
     AND  t1.OrderDate = t2.OrderDate 
     AND  t1.Charge = t2.Charge 
     ) 
2

सीधे शब्दों में जोड़ें:

GROUP BY AcctNo, OrderDate, Charge 
HAVING COUNT(1) = 1 

GROUP BY संगठनों को एक साथ एक ही AcctNo, OrderDate और शुल्क के साथ सभी पंक्तियों, तो HAVING COUNT(1) = 1 केवल उन पंक्तियों को दिखाता है जहां केवल 1 प्रजननकर्ता था।

1

सही दिशा में नींद के लिए धन्यवाद kekekela धन्यवाद।

क्वेरी कि परिणाम मैं चाहता था का उत्पादन किया है:

SELECT AcctNo, OrderDate, Charge FROM Table1 GROUP BY AcctNo, OrderDate, Charge 
HAVING (COUNT(AcctNo) = 1) AND (COUNT(OrderDate) = 1) AND (COUNT(Charge) = 1); 

या अधिक गिरीश के उदाहरण के आधार पर सरल बनाया:

SELECT AcctNo, OrderDate, Charge FROM Table1 GROUP BY AcctNo, OrderDate, Charge 
HAVING COUNT(1) = 1; 
0

तुम बस PKID छोड़ सकता है सभी रिकॉर्ड वापस जाने के लिए:

SELECT DISTINCT 
      ClientID 
     , Name 
     , AcctNo 
     , OrderDate 
     , Charge 
FROM  table; 

नोट: यह आप जो पूछ रहे हैं उससे थोड़ा अलग है।
यह एक गैर-अद्वितीय क्षेत्र को हटाकर एक अद्वितीय सेट देता है।
आपके उदाहरण से, आप गैर-डुप्लिकेट वापस करने के लिए कह रहे हैं।

मैं केवल अपने उदाहरण उपयोगी किया जा रहा है, तो आप "अच्छा" रिकॉर्ड निकाल कर एक टेबल को साफ करने के
कोशिश कर रहे हैं देख सकते हैं।

0

आप में गैर-अद्वितीय रिकॉर्ड पहले यह निर्धारित कर सकता है, और फिर उन रिकॉर्ड है कि सेट में नहीं के लिए परीक्षण - यह

select * from mytable where pkid not in 
(select t1.pkid 
from mytable t1 inner join mytable t2 
on t1.pkid <> t2.pkid 
and t1.acctno = t2.acctno 
and t1.orderdate = t2.orderdate 
and t1.charge = t2.charge) 

भीतरी क्वेरी के अंतिम भाग आप "समानता के लिए मापदंड के साथ बेला की सुविधा देता है की तरह "- परीक्षण करने के लिए आवश्यक कॉलम जोड़ें। बेशक, यह एक बहुत अधिक दिलचस्प हो जाता है कि प्राथमिक कुंजी :) ऐसे मामलों में मैं आमतौर पर अंत बनाने एक

केटिल

+0

क्वेरी नहीं पढ़ चाहिए '>' या '<' बजाय '<>'? के रूप में मार्टिन स्मिथ समाधान # 2 एक ही - साथ '<>', परिणाम * सिर्फ एक प्रतिलिपि – crizzis

+0

नहीं है, <> यह सुनिश्चित करता है कि आप अपने आप के खिलाफ एक रिकार्ड का परीक्षण नहीं है के बजाय डुप्लिकेट पंक्तियों में से कोई भी * शामिल होंगे। निर्दिष्ट डेटा स्तंभों की विशिष्टता सुनिश्चित करने के लिए पर्याप्त नहीं - एक < or > केवल अधिक या कम pkid मूल्यों के साथ pkids पर डुप्लिकेट खोजना होगा। –

0
SELECT GMPS.gen.ProductDetail.PaperType, GMPS.gen.ProductDetail.Size FROM 
GMPS.gen.ProductDetail GROUP BY GMPS.gen.ProductDetail.PaperType, 
GMPS.gen.ProductDetail.Size 
HAVING COUNT(1) = 1; 
संबंधित मुद्दे