select distinct * from test t
where not exists
(select 1
from test t1
where (t1.a = t.a and t1.b = t.b or t1.b = t.a and t1.a = t.b) and t1.a < t.a
)
Выборка первых записей(не дублирующихся обратным значением)
Вот мучаюсь с таким вопросом, решил обратится к великим гуру sql )
Есть таблица test с полями a и b и записями
test
a | b
1 2
2 1
3 1
1 3
2 4
Нужно выбрать все уникальные, не повторяющиеся записи. Запись (1,2 и 2,1), (3,1 и 1,3) является дублем.
В результате должно получится:
test
a | b
1 2
3 1
2 4
Что посоветуете?
Код:
Код:
WITH mytab AS (
SELECT 1 a, 2 b FROM dual UNION ALL
SELECT 2, 1 FROM dual UNION ALL
SELECT 3, 1 FROM dual UNION ALL
SELECT 1, 3 FROM dual UNION ALL
SELECT 2, 4 FROM dual
)
SELECT DISTINCT least(a, b) a, greatest(a, b) b FROM mytab;
SELECT 1 a, 2 b FROM dual UNION ALL
SELECT 2, 1 FROM dual UNION ALL
SELECT 3, 1 FROM dual UNION ALL
SELECT 1, 3 FROM dual UNION ALL
SELECT 2, 4 FROM dual
)
SELECT DISTINCT least(a, b) a, greatest(a, b) b FROM mytab;
Вместо конструкции with, эмулирующей таблицу, подставляем реальную таблицу (mytab).
Да, так гораздо элегантнее. Вопрос только, совместим ли этот вариант с СУБД автора топика)
Помимо Oracle, должно работать в PostgreSQL и MySQL.
При желании можно расписать greatest и least через case.