【问题标题】:oracle sql creating combinations same table without repeatoracle sql创建组合同一张表而不重复
【发布时间】:2015-05-29 08:49:02
【问题描述】:

我该如何解决这个问题? 我需要消除笛卡尔积的重复,即一张表的重复。 我想过使用“连接方式”。谢谢。

create table foo (
num number(2)
);

insert into foo values (1);
insert into foo values (2);
insert into foo values (3);

select a.num,b.num
from foo a, foo b;

NUM NUM
--- ---
 1   1 
 1   2 
 1   3 
 2   1 * duplicated
 2   2 
 2   3 
 3   1 * duplicated
 3   2 * duplicated
 3   3 

【问题讨论】:

    标签: sql oracle cartesian


    【解决方案1】:

    你可以试试这个:

    select a.num,b.num
      from foo a cross join foo b
     where a.num <= b.num
    

    【讨论】:

      【解决方案2】:
      select a.num,b.num
      from foo a, foo b
      where a.num = b.num
      

      【讨论】:

      • 停止推广逗号分隔的 JOINS!
      • 虽然这篇文章可能会回答这个问题,但添加一些解释并可能添加一些指向相关文档的链接仍然是一个好主意。具有良好解释和参考的答案通常对当前的 OP 和未来的访问者都更有用。完整详细的答案也更有可能吸引正面投票。
      【解决方案3】:

      SQL Fiddle

      Oracle 11g R2 架构设置

      create table foo ( num ) AS
      SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 3;
      

      查询 1

      select a.num,b.num
      from foo a CROSS JOIN foo b
      WHERE a.num <= b.num
      

      Results

      | NUM | NUM |
      |-----|-----|
      |   1 |   1 |
      |   1 |   2 |
      |   1 |   3 |
      |   2 |   2 |
      |   2 |   3 |
      |   3 |   3 |
      

      【讨论】:

        【解决方案4】:

        不需要交叉连接,因为您正在执行连接,您希望匹配表的第二个实例中的行,这些行的编号与表的第一个实例中的编号相同或更大。这就是防止“重复”条目的方法:

        with foo as (SELECT LEVEL num FROM DUAL CONNECT BY LEVEL <= 3)
        select f1.num f1_num,
               f2.num f2_num
        from   foo f1
               join foo f2 on (f1.num <= f2.num);
        
            F1_NUM     F2_NUM
        ---------- ----------
                 1          1
                 1          2
                 1          3
                 2          2
                 2          3
                 3          3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-26
          • 1970-01-01
          • 1970-01-01
          • 2013-10-16
          • 1970-01-01
          • 2014-10-04
          • 2021-12-31
          • 2010-09-13
          相关资源
          最近更新 更多