首页 > 解决方案 > 使用交叉应用选择不会返回预期的结果

问题描述

select
    *
from
    (select level l from dual connect by level <4) t cross apply
    (select tt.a from (
        select level a from dual connect by level < t.l ) tt )

返回

L A
1 1
2 1
3 1

但我已经预料到了

L A
2 1
3 1
3 2

因为

select level a from dual connect by level < 1 -> Null
select level a from dual connect by level < 2 -> 1
select level a from dual connect by level < 3 -> 1,2

标签: sqloracle

解决方案


您的问题反映了对分层查询的一个非常普遍的误解。即:

connect by条件仅适用于2级及以上。如果没有start with子句,将始终生成级别 1。第 1 层的条件在start with子句中给出,而不是在connect by.

为了得到你想要的结果,你必须添加一个start with具有相同条件的子句(即,level < t.l)。

但是,测试修改后的查询会导致错误;那是由于相关性超过一级深度引起的,这实际上是与 相关的问题cross apply,而不是与分层位相关的问题。

编辑-实际上似乎levelstart with子句中使用也没有按预期工作。不过,我将保留这个答案 - 关于您的期望为何不正确的解释仍然有效。


推荐阅读