【问题标题】:Cartesian product to same table in oracle without duplicate笛卡尔积到oracle中的同一张表没有重复
【发布时间】:2015-11-23 08:46:27
【问题描述】:

我有一个表,我想用同一个表本身生成该数据的笛卡尔坐标。

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

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2012-02-24
      • 2011-09-18
      • 1970-01-01
      • 2021-10-12
      相关资源
      最近更新 更多