sql - 使用交叉应用选择不会返回预期的结果
问题描述
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
解决方案
您的问题反映了对分层查询的一个非常普遍的误解。即:
该connect by
条件仅适用于2级及以上。如果没有start with
子句,将始终生成级别 1。第 1 层的条件在start with
子句中给出,而不是在connect by
.
为了得到你想要的结果,你必须添加一个start with
具有相同条件的子句(即,level < t.l
)。
但是,测试修改后的查询会导致错误;那是由于相关性超过一级深度引起的,这实际上是与 相关的问题cross apply
,而不是与分层位相关的问题。
编辑-实际上似乎level
在start with
子句中使用也没有按预期工作。不过,我将保留这个答案 - 关于您的期望为何不正确的解释仍然有效。
推荐阅读
- azure-devops - azure pipelines.yml 使用带有 azure cli 和 python 3 的 vm?
- javascript - 尝试在那时测试我的 catch 块没有成功
- css - 自定义组合框中的默认文本
- python - 如何在某些条件下通过python选择Html页面中的前一个元素
- php - 如何在嵌套数组中找到一个值,然后返回该父级?
- c - 如何使用 C 在 Windows 中执行批处理 (.bat) 文件
- javascript - 哪一种代码更有效?
- javascript - Hapi auth cookie 设置但 request.auth.credentials 为空
- css - lesscss如何转义括号
- excel - 表单/代码没有传输到 excel wb/ws,当/如果它传输,它的速度很慢