Декартово произведение на ту же таблицу в оракуле без дубликатов

У меня есть таблица, и я хочу создать декартово значение этих данных с той же самой таблицей.

TABLE:  TEMP_TEST

         FROM_COL   
        --------------
            A      
            B   
            C   

Если я напишу приведенный ниже запрос для декартова, я получу вывод

     SELECT A.FROM_COL FROM_COL1,
  B.FROM_COL FROM_COL2
FROM TEMP_TEST A,
  TEMP_TEST B
WHERE A.FROM_COL!=B.FROM_COL ; 

выход

 FROM_COL1 FROM_COL2
    A              B
    A              C
    B              A
    B              C
    C              A
    C              B

Но если присутствует A-B, я не хочу, чтобы B-A. Как я могу написать для этого запрос?

Мне нужен вывод ниже

FROM_COL1 FROM_COL2
        A              B
        A              C
        B              C

person user5073139    schedule 28.08.2015    source источник


Ответы (1)


Вы были очень близки. Просто измените != на <:

with temp_test as (select 'A' from_col from dual union all
                   select 'B' from_col from dual union all
                   select 'C' from_col from dual)
select a.from_col from_col1,
       b.from_col from_col2
from   temp_test a,
       temp_test b
where  a.from_col < b.from_col;

FROM_COL1 FROM_COL2
--------- ---------
A         B        
A         C        
B         C        

Было бы лучше (т.е. более читаемым/отраслевым стандартом), если бы вы переписали запрос, используя синтаксис соединения ANSI:

select a.from_col from_col1,
       b.from_col from_col2
from   temp_test a
       inner join temp_test b on (a.from_col < b.from_col);
person Boneist    schedule 28.08.2015