Oracle选择星号连接由SQL-92组合的连接

9
以下查询显示,select *connect byleft 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 * 不行。 - MT0
1
并添加 WHERE name IS NOT NULL AND ( special IS NULL OR special IS NOT NULL ) 将意味着这些列出现在 SELECT * 中。 - MT0
2个回答

0

我相信你正在寻找的文档可以在这里找到:分层查询

最相关的部分:

Oracle按照以下步骤处理分层查询:
  • 首先评估连接(如果存在),无论连接是在FROM子句中指定还是在WHERE子句谓词中指定。

  • 然后评估CONNECT BY条件。

  • 最后评估剩余的WHERE子句谓词。

然后,Oracle使用这些评估的信息来使用以下步骤形成层次结构:

  1. Oracle选择层次结构的根行-满足START WITH条件的那些行。

  2. Oracle选择每个根行的子行。每个子行必须满足相对于一个根行的CONNECT BY条件的条件。

  3. Oracle选择连续的子代行。Oracle首先选择步骤2返回的行的子代,然后选择这些子代的子代,以此类推。Oracle始终通过相对于当前父行评估CONNECT BY条件来选择子行。

  4. 如果查询包含没有连接的WHERE子句,则Oracle会消除不满足WHERE子句条件的层次结构中的所有行。Oracle为每行单独评估此条件,而不是删除不满足条件的行的所有子行。

  5. Oracle按图9-1所示的顺序返回行。在图中,子项显示在其父项下方。有关分层树的说明,请参见图3-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
;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接