#sql #oracle #oracle10g
#sql #Oracle #oracle10g
Вопрос:
Предположим, у нас есть таблица:
id1 id2
1 2
2 1
3 4
4 3
Ожидаемый результат
id1 id2
1 2
3 4
Строки 1,2 и 2,1 одинаковы, и требуется вывести только одну.
Какой SQL-запрос для этого.
Ответ №1:
Предполагая, что вы RDBMS
поддерживаете LEAST
и GREATEST
(Oracle делает):
SELECT DISTINCT LEAST(id1, id2), GREATEST(id1, id2)
FROM mytable
Кроссплатформенная версия:
SELECT DISTINCT
CASE WHEN id1 < id2 THEN id1 ELSE id2 END,
CASE WHEN id1 > id2 THEN id1 ELSE id2 END
FROM mytable
Ответ №2:
Select ...
From MyTable As T
Where Exists (
Select 1
From MyTable As T2
Where T2.id1 = T.id2
And T2.id2 = T.id1
)
And T.id1 < T.id2
Другое решение, использующее объединение
Select T.id1, T.id2
From MyTable As T
Where T.id1 <= T.id2
Union
Select T.id2, T.id1
From MyTable As T
Where T.id1 > T.id2
Ответ №3:
Моя интерпретация того, что вы пытаетесь сделать, такова: возвращаемые строки были id1, совпадающими с id2, а id2 — с id1, но возвращаемые строки из этого набора возвращались только тогда, когда id1 также меньше или равно id2.
select x.id1, x.id2 from
myTable x, myTable y
where x.id1 = y.id2 and y.id1 = x.id2 and x.id1 <= y.id1
Ответ №4:
Точно такой же вопрос мне также пришлось недавно решать. Смотрите раздел Устранение дубликатов.
select id1, id2
from t
where not exists (
select 1
from t
where id1 = t.id2
and id2 = t.id1
and rowid > t.rowid
);