2017-02-20 3 views
-1

Я имею ниже фиктивную таблицуВыберите различные значения, основанные на множественных колонках из таблицы

select * from (
select 'A' as col1, 'B' as col2 from dual 
union 
select 'B' as col1, 'A' as col2 from dual 
union 
select 'A' as col1, 'C' as col2 from dual 
union 
select 'C' as col1, 'A' as col2 from dual 
union 
select 'A' as col1, 'D' as col2 from dual 
)a 

который даст выход, как показано ниже

col1 col2 
A B 
A C 
A D 
B A 
C A 

Я хочу найти различные значения из этой таблицы, как показано ниже

col1 col2 
A B 
A C 
A D 

первая строка может быть АВ или ВА так же, как второй может быть переменного или СА

Возможно ли это? Мы получили решение вышеуказанной проблемы, которая ниже

select distinct least(col1, col2), greatest(col1, col2) 
from the_table; 

, но если есть больше, чем 2 колонки, то я бы не работать

Предположим НИЖЕ СЦЕНАРИЙ

Входной

col1 col2 col3 
    A B E 
    A C E 
    A D E 
    B A F 
    C A E 

Выход

col1 col2 col3 
    A B E 
    A D E 
    B A F 
    C A E 

то каково было бы решение?

+1

Пожалуйста, помечать с базой данных ты используешь. Oracle и Postgres не совпадают. –

+0

Мне нужен ответ, который будет работать во всей базе данных –

ответ

2

Вот один метод:

select col1, col2 
from t 
where col1 <= col2 
union all 
select col1, col2 
from t 
where col1 > col2 and 
     not exists (select 1 from t t2 where t2.col1 = t.col2 and t2.col2 = t.col1); 
+0

он работает, позвольте мне проанализировать запрос ... thnx для быстрого ответа :) –

+0

мы также можем использовать регистр case как «выбрать отдельный случай, когда col1 <= col2, а затем col1 else col2 end как минимум, случай, когда col1 <= col2, а col2 else col1 заканчивается как наибольший из таблицы; " @Gordon Linoff. Не могли бы вы помочь мне найти решение для более чем двух столбцов. –

2

Следующая будет работать для Oracle и Postgres:

select distinct least(col1, col2), greatest(col1, col2) 
from the_table; 

Интернет Пример: http://rextester.com/BZXC69735

+0

Значения строк могут быть полными словами, такими как Apple, Orange ... так что в этом случае не получится –

+0

@RamanSingh: уверен, что так будет. –

+0

Позвольте мне проверить :) @a_horse_with_no_name –

0
select DISTINCT * from (
select 'A' as col1, 'B' as col2 from dual 
union 
select 'B' as col1, 'A' as col2 from dual 
union 
select 'A' as col1, 'C' as col2 from dual 
union 
select 'C' as col1, 'A' as col2 from dual 
union 
select 'A' as col1, 'D' as col2 from dual 
)a 
+0

Он не работает и поставил правильный ответ – Mansoor

+0

Вернет оба A, C и C, A. – jarlh

+0

Вы протестировали это решение на своем конце ???? @ Rahul –

0
select col1, col2 from t where col1 <= col2 
union 
select col2, col1 from t where col1 > col2 
+0

Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, было бы [значительно улучшено, если бы оно включало объяснение] (// meta.stackexchange.com/q/114762) * как * и * почему * это решает проблему. Помните, что вы отвечаете на вопрос читателей в будущем, а не только на человека, который спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. –

+6

@TobySpeight, да, я знаю ... Обычно я это делаю, но мне пришлось вытащить собаку на прогулку. – jarlh

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