2013-05-04 51 views
1

我有一些數據,看起來像這樣:過濾行

A | B 
97 |556 
257|803 
803|257 
257|323 
556|97 

我試圖找出最好的方式來篩選結果,例如,它消除了重複行。例如,它只顯示行257 | 803而不顯示803 | 257。什麼是最好的方法來做到這一點?

+1

什麼DB引擎您使用的? – 2013-05-04 10:42:14

回答

3
SELECT * 
FROM T x 
WHERE x.A < x.B 
OR NOT EXISTS (
    SELECT * 
    FROM T y 
    WHERE y.A = x.B AND y.B = x.A 
    ); 

這種奇怪的情況真值表:

A | B | (A<B) | (NOT exists) | (A<B OR NOT exists) 
---+----+-------+--------------+---------------------- 
97 |556 | True | False  | True 
257|803 | True | False  | True 
803|257 | False | False  | False 
257|323 | True | True   | True 
556|97 | False | False  | False 

結果:

a | b 
-----+----- 
    97 | 556 
257 | 803 
257 | 323 
(3 rows) 
+0

對於具有相同值的行,這將失敗。OP沒有對他們說什麼,也沒有說這個例子表明他們可以在場,但如果我是你,我會規定限制,以防萬一。儘管如此,+1可以解決問題。 – 2013-05-04 22:41:43

+0

啊,很好,這工作真的很好。謝謝!只是你知道,我已經過濾了具有相同值的行。 – samturner 2013-05-05 00:21:16

-2

在您的查詢中再添加一個條件 - leftparam < = rightparam。它將消除所有重複的反轉對。 80 | 100好,100 | 80刪除。

+0

是不是這個預期的行爲?刪除重複的反轉對嗎? – 2013-05-04 10:26:11

+0

是錯過了,但假設有獨特的記錄123 | 70,這將被刪除,即使它不重複 – 2013-05-04 10:31:49

+0

我想我誤解了這個問題。我認爲你的問題是反轉重複對的問題。 – 2013-05-04 10:36:31

1

試試這個QueryMYSQL

select distinct greatest(t1.A, t1.B), least(t1.A, t1.B) 
from your_table t1 , your_table t2 
where t1.B=t2.A and t1.A=t2.B 

SQL Fiddle

Refer my Answer. Only the inner Query

Edit

SQL SERVER版本

select * from 
(select 
case when t1.A>t1.B 
then t1.A end as A1, 
case when t1.A>t1.B 
then t1.B end as B1 
from your_table t1 , your_table t2 
where t1.B=t2.A and t1.A=t2.B)t 
where t.A1 is not null 

SQL Fiddle

+2

您的建議不會返回'257 | 323'行。爲什麼? – 2013-05-04 22:37:59

1

在SQLServer2005的+使用選項與CROSS APPLY操作

SELECT * 
FROM dbo.test102 t 
    OUTER APPLY (
       SELECT t2.A, t2.B 
       FROM dbo.test102 t2 
       WHERE t.A = t2.B AND t.B = t2.A     
       ) o    
WHERE t.A > t.B OR o.A IS NULL 

演示上SQLFiddle

SELECT * 
FROM dbo.test102 t LEFT JOIN dbo.test102 t2 ON t.A = t2.B AND t.B = t2.A 
WHERE t.A > t.B OR t2.A IS NULL 
+0

與@Luv同樣的問題:爲什麼從結果中忽略了'257 | 323'行? – 2013-05-04 22:37:38

+0

我以爲OP想刪除這些記錄,但我錯了。謝謝你澄清Andriy。順便說一句,答案更新(添加行省略)。 – 2013-05-05 06:03:15

+0

啊,我知道,這個問題的確可以這樣讀,你以前的建議現在對我來說很有意義。我認爲讓我感到困惑的是,你選擇了OP希望刪除的行,但無論如何,我理解你的意圖。有趣的是,你最終得到了與@wildplasser基本相同的建議:一個不等式和一個(不同實現的)反連接。 – 2013-05-05 18:34:49