以下查询显示,select *
与connect by
和left join
相结合并不会返回所有列,而只返回这些条件中使用的列。
这种行为对我很有用,因为select *
不应该在发布中使用,它对请求数据很有用。
with t1 as (
select 1 id, 0 parent, 'ROOT' name from dual
union all
select 2 id, 1 parent, 'CHILD-1' name from dual
union all
select 3 id, 1 parent, 'CHILD-2' name from dual
), t2 as (
select 1 t1id, 'node' special from dual
)
select * from t1
left join t2 on t2.t1id=t1.id
start with id = 2
connect by prior parent = id;
而其他查询返回所有列
select * from t1
start with id = 2
connect by prior parent = id;
select * from t1
left join t2 on t2.t1id=t1.id;
我找不到关于此功能的文档,有没有?
答案 0 :(得分:0)
我相信您要查找的文档可以在此处找到:Hierarchical Queries
最相关的部分:
Oracle按如下方式处理分层查询:
然后,Oracle使用这些评估中的信息来构建层次结构,使用以下步骤:
首先评估连接(如果存在),无论是在FROM子句中还是在WHERE子句谓词中指定了连接。
评估CONNECT BY条件。
评估剩余的WHERE子句谓词。
Oracle选择层次结构的根行 - 满足START WITH条件的那些行。
Oracle选择每个根行的子行。每个子行必须满足CONNECT BY条件相对于其中一个根行的条件。
Oracle选择连续几代子行。 Oracle首先选择步骤2中返回的行的子项,然后选择这些子项的子项,依此类推。 Oracle总是通过评估关于当前父行的CONNECT BY条件来选择子项。
如果查询包含没有连接的WHERE子句,则Oracle会从层次结构中删除不满足WHERE子句条件的所有行。 Oracle单独评估每一行的这种情况,而不是删除不满足条件的行的所有子项。
- 醇>
Oracle按照图9-1中显示的顺序返回行。在图中,孩子出现在父母的下方。有关分层树的说明,请参见图3-1,"分层树"。
答案 1 :(得分:0)
不是SQL-92,但完成SELECT * + CONNECT BY + LEFT JOIN
WITH t1 AS (
SELECT 1 ID, 0 PARENT, 'ROOT' NAME FROM dual
UNION ALL
SELECT 2 ID, 1 PARENT, 'CHILD-1' NAME FROM dual
UNION ALL
SELECT 3 ID, 1 PARENT, 'CHILD-2' NAME FROM dual
), t2 AS (
SELECT 1 t1id, 'node' special FROM dual
)
SELECT *
FROM t1, t2
WHERE t2.t1id(+) = t1.ID
START WITH ID = 2
CONNECT BY PRIOR PARENT = ID
;