2009-08-27 7 views
5

मेरे पास कॉलम एक्स और वाई के साथ डेटा का एक सेट है। इस सेट में पंक्तियां हैं, जहां किसी भी 2 दिए गए मानों के लिए, ए और बी, कॉलम एक्स और वाई में ए और बी के साथ एक पंक्ति है और बी और ए के साथ कॉलम एक्स और वाई में एक दूसरी पंक्ति होगी।टी-एसक्यूएल क्वेरी - 2 कॉलम में अद्वितीय पंक्तियां प्राप्त करें

उदा

 **Column X**   **Column Y** 
Row 1  A      B 
Row 2  B      A    
  • इस सेट है कि इस नियम का पालन में डेटा के कई जोड़े हैं।
  • कॉलम एक्स और वाई में ए, बी के साथ हर पंक्ति के लिए, वहाँ हमेशा बी, एक्स में एक और वाई के साथ एक पंक्ति
  • कॉलम एक्स हो जाएगा और वाई प्रकार int

मैं के हैं टी-एसक्यूएल क्वेरी की आवश्यकता है जो ऊपर दिए गए नियमों के साथ एक सेट दिया गया है, मुझे या तो पंक्ति 1 या पंक्ति 2 लौटाएगी, लेकिन दोनों नहीं।

या तो जवाब बहुत मुश्किल है, या यह इतना आसान है कि मैं पेड़ के लिए जंगल नहीं देख सकता, किसी भी तरह से यह मुझे दीवार को चला रहा है।

+0

वाह, मैंने इस प्रश्न को पोस्ट करने के बाद से कुछ भी नहीं किया है। –

+0

इसे यहां पोस्ट करने के बाद, मैं वास्तव में कुछ घंटों तक सोने में कामयाब रहा! आज सुबह जवाबों का परीक्षण करेंगे। –

उत्तर

9

आपकी क्वेरी विधेय में जोड़े,

where X < Y 

और तुम दोनों कभी नहीं पंक्ति प्राप्त कर सकते हैं, लेकिन हमेशा एक पंक्ति हो जाएगा।

(मतलब यह है कि जब आप ने लिखा "दिए गए दो मूल्यों" आप दो अलग दिए गए मान का मतलब; दो मानों एक ही हो सकता है, विधेय where X <= Y (सभी से छुटकारा पाने के लिए जोड़ "उलट" पंक्तियों जहाँ X > वाई) और फिर अपने चयन की सूची में कोई distinct जोड़ने (किसी भी दो पंक्तियों संक्षिप्त करने के लिए जहां X == एक पंक्ति में वाई))

टिप्पणी करने के लिए जवाब में

:।

यही है, वर्तमान में आपकी क्वेरी है अगर select foo, x, y from sometable where foo < 3; इसे select foo, x, y from sometable where foo < 3 and x < y; पर बदलें, या दूसरे मामले के लिए (जहां एक्स और वाई अलग-अलग मान नहीं हैं) select distinct foo, x, y from sometable where foo < 3 and x <= y;

+0

मैंने अभी एक परीक्षण चलाया और यह काम नहीं किया। – ChaosPandion

+0

कैओस, आपने किस डेटासेट पर अपना परीक्षण चलाया? – tpdi

+0

आपका समाधान काम करता है। मैं क्षमाप्रार्थी हूं। – ChaosPandion

0

प्राप्त करने के लिए उच्चतम और प्रत्येक जोड़ी के सबसे कम है, तो आप इस्तेमाल कर सकते हैं:

(X+Y+ABS(X-Y))/2 as High, (X+Y-ABS(X-Y))/2 as Low 

तो अब DISTINCT का उपयोग उनमें से जोड़े मिलता है।

SELECT DISTINCT 
    (X+Y+ABS(X-Y))/2 as High, (X+Y-ABS(X-Y))/2 as Low 
FROM YourTable 
0
SELECT O.X, O.Y 
FROM myTable O 
WHERE EXISTS (SELECT X, Y FROM myTable I WHERE I.X = O.Y AND I.Y = O.X) 

मैं इस प्रयास नहीं किया है। लेकिन, यह काम करना चाहिए।

1

यह काम करना चाहिए।

Declare @t Table (PK Int Primary Key Identity(1, 1), A int, B int); 

Insert into @t values (1, 2); 
Insert into @t values (2, 1); 
Insert into @t values (3, 4); 
Insert into @t values (4, 3); 
Insert into @t values (5, 6); 
Insert into @t values (6, 5); 

Declare @Table Table (ID Int Primary Key Identity(1, 1), PK Int, A Int, B Int); 
Declare @Current Int; 
Declare @A Int; 

Insert Into @Table 
Select PK, A, B 
From @t; 

Set @Current = 1;  

While (@Current <= (Select Max(ID) From @Table) Begin  

    Select @A = A 
    From @Table 
    Where ID = @Current;   

    If (@A Is Not Null) Begin 

     Delete From @Table Where B = @A;    
     If ((Select COUNT(*) From @Table Where A = @A) > 1) Begin 
      Delete From @Table Where ID = @Current; 
     End 

    End 

    Set @A = Null; 
    Set @Current = @Current + 1; 

End 

Select a.* 
From @tAs a 
    Inner Join @Table As b On a.PK = b.PK 
+0

नीचे वोट की व्याख्या करने के लिए देखभाल? – ChaosPandion

+0

मैंने आपको वोट नहीं दिया, लेकिन शीर्ष वोट दिया गया जवाब इससे काफी बेहतर है, यह एक सेट आधारित समस्या के प्रक्रियात्मक समाधान की तरह लगता है। –

+0

मैंने आपको वोट भी नहीं दिया, लेकिन अस्थायी तालिका का उपयोग करते हुए, थोड़ी देर लूप का उपयोग किया, और उसके बाद उस लूप के प्रत्येक पुनरावृत्ति के लिए एक चयन और डिलीट, बहुत अधिक है। आपको कर्सर की आवश्यकता नहीं है - और यदि आपने किया है, तो अपने स्वयं के (कम कुशल) "कर्सर को थोड़ी देर में लूप" रोल करने के बजाय, कर्सर का उपयोग क्यों न करें? जैसा कि सैम कहते हैं, आप एक प्रक्रियात्मक तरीके से इस पर पहुंच रहे हैं, डेटाबेस सेट किए गए सेट टूल्स का उपयोग न करें। – tpdi

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