2010-02-28 3 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'). –

+0

Черт. Я был так близок к тому, что имел это, я оставил сравнение заказов, и поэтому мои результаты всегда были ноль. – CJH

+0

Я бы сказал 'w

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 

Использование LEAST и GREATEST также гарантирует, что возвращается w x вместо x w.

+0

Не знаю, о '' least' и greatest'. Ницца. Не будет ли здесь «отличной» работы? – Kobi

+0

Да, 'DISTINCT' вернет то же самое в этом случае. Вам нужно будет проверить производительность, но я думаю, что все будет так. –

+0

Очень круто. Хорошее решение. – CJH

Смежные вопросы