2010-02-28 60 views
3

我有以下SQL表:如何從SQL表中刪除對面行

A|B 
--- 
w|x 
x|w 
y|z 
z|y 

我可以構造一個查詢,這將產生以下結果:

A|B 
--- 
w|x 
y|z 

總之,我想將兩列視爲無序集合,使(a,b)==(b,a)。

回答

2

「最佳」代碼取決於數據庫,但以下是DBMS無關:

SELECT  t.A, 
      t.B 
FROM  my_table t 
LEFT JOIN my_table t2 
     ON t.A = t2.B 
     AND t.B = t2.A 
     AND t.A < t.B 
WHERE  t2.A IS NULL 
+0

+1:我正要編輯我的答案並添加這個答案:)儘管使用't.A> t.B'來獲得指定的結果('w | x'而不是'x | w')。 – 2010-02-28 08:34:00

+0

該死的。我非常接近這一點,所以我排除了訂購比較,所以我的結果總是零。 – CJH 2010-02-28 08:36:01

+0

我會說'w 2010-02-28 08:36:43

1

你可以嘗試以下方法:

SELECT LEAST(a,b) a, GREATEST(a,b) b 
FROM t 
GROUP BY LEAST(a,b), GREATEST(a,b) 

用下面的測試表t

CREATE TABLE t (a VARCHAR(1), b VARCHAR(1)); 

INSERT INTO t VALUES ('w','x'),('x','w'),('y','z'),('z','y'); 

返回:

w x 
y z 

使用LEASTGREATEST還確保返回w x而不是x w

+0

不知道'least'和'greatest'。尼斯。這裏不會有'獨特'的作品嗎? – Kobi 2010-02-28 08:29:01

+0

是的,在這種情況下,'DISTINCT'會返回相同的值。你將不得不測試性能,但我想它會是一樣的。 – 2010-02-28 08:30:18

+0

非常酷。好的解決方案 – CJH 2010-02-28 08:37:33