代码之家  ›  专栏  ›  技术社区  ›  decompiled

为什么这个查询会导致Oracle中的合并笛卡尔联接

  •  4
  • decompiled  · 技术社区  · 16 年前

    我有一个最近需要修改的查询。

    这是原版

    SELECT RTRIM (position) AS "POSITION",
       .  // Other fields
       .
       .
       FROM schema.table x WHERE hours > 0 
        AND pay = 'RGW'
        AND NOT EXISTS( SELECT position FROM schema.table2 y where  y.position = x.position )
    

    这是新版本

    SELECT RTRIM (position) AS "POSITION",
       .  // Other fields
       .
       .
       FROM schema.table x WHERE hours > 0 
        AND pay = 'RGW'
        AND NOT EXISTS( SELECT position FROM  schema.table2 y where y.date = get_fiscal_year_start_date (SYSDATE) AND y.position = x.position )
    

    UDF get_fiscal_year_start_date() 返回日期参数的会计年度开始日期。第一个查询运行良好,但第二个查询创建合并笛卡尔连接。我查看了表上的索引,发现位置和日期都被索引了。我的问题是StackOverflow为什么要添加 y.date = get_fiscal_year_start_date (SYSDATE) 在Oracle10g中导致合并笛卡尔联接。

    1 回复  |  直到 14 年前
        1
  •  10
  •   APC    16 年前

    问题是,甲骨文不知道 get_fiscal_year_start_date (SYSDATE) 返回一个结果。所以假设它会生成很多行。

    显然,我手头没有测试工具,但是这个版本的查询应该会取消合并笛卡尔连接。

    SELECT RTRIM (position) AS "POSITION", 
    .  // Other fields 
    . 
    . 
    FROM schema.table x 
         , ( select get_fiscal_year_start_date (SYSDATE) as fiscal_year 
             from dual ) fy
    WHERE hours > 0  
    AND pay = 'RGW' 
    AND NOT EXISTS( SELECT position 
                    FROM  schema.table2 y 
                    where y.date = fy.fiscal_year
                    AND y.position = x.position ) 
    

    Oracle知道Dual只有一行,因此子查询将返回一个值。