Oracle select asterisk connect by join sql-92 组合
Posted
技术标签:
【中文标题】Oracle select asterisk connect by join sql-92 组合【英文标题】:Oracle select asterisk connect by join sql-92 combination 【发布时间】:2016-05-22 02:03:59 【问题描述】:以下查询显示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;
我找不到有关此功能的文档,有吗?
【问题讨论】:
SELECT t1.*, t2.*
有效。不知道为什么SELECT *
没有。
并添加 WHERE name IS NOT NULL AND ( special IS NULL OR special IS NOT NULL )
将意味着这些列出现在 SELECT *
中。
【参考方案1】:
不是 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
;
【讨论】:
【参考方案2】:我相信您正在寻找的文档可以在这里找到:Hierarchical Queries
最相关的部分:
Oracle 处理分层查询如下:
如果存在连接,则首先评估连接,无论连接是在 FROM 子句中指定还是使用 WHERE 子句谓词。
评估 CONNECT BY 条件。
评估任何剩余的 WHERE 子句谓词。
Oracle 然后使用来自这些评估的信息通过以下步骤形成层次结构:
Oracle 选择层次结构的根行——那些满足 START WITH 条件的行。
Oracle 选择每个根行的子行。每个子行必须满足与根行之一相关的 CONNECT BY 条件。
Oracle 选择连续几代的子行。 Oracle 首先选择步骤 2 中返回的行的子代,然后选择这些子代的子代,以此类推。 Oracle 总是通过评估与当前父行相关的 CONNECT BY 条件来选择子行。
如果查询包含没有连接的 WHERE 子句,则 Oracle 会从层次结构中删除不满足 WHERE 子句条件的所有行。 Oracle 对每一行单独评估此条件,而不是删除不满足条件的行的所有子行。
Oracle 按图 9-1 所示的顺序返回行。在图中,孩子出现在父母的下方。有关层次树的解释,请参见图 3-1,“层次树”。
【讨论】:
以上是关于Oracle select asterisk connect by join sql-92 组合的主要内容,如果未能解决你的问题,请参考以下文章