Sql-запрос для сравнения строк

#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
);