笛卡尔积与oracle中的同一表无重复

时间:2015-08-28 16:04:56

标签: oracle self-join cartesian-product cross-join cartesian

我有一张表,我想用相同的表本身生成该数据的笛卡儿。

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

1 个答案:

答案 0 :(得分:2)

你非常接近。只需将!=更改为<

即可
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);