Oracle通过join sql-92组合选择星号连接

Nah*_*eul 7 oracle connect-by left-join

以下查询显示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;
Run Code Online (Sandbox Code Playgroud)

而其他查询返回所有列

  select * from t1
  start with id = 2
  connect by prior parent = id;

  select * from t1
  left join t2 on t2.t1id=t1.id;
Run Code Online (Sandbox Code Playgroud)

我找不到关于这个功能的文档,有没有?

Sea*_*haw 0

我相信您正在寻找的文档可以在这里找到:Hierarchical Queries

最相关的部分:

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“分层树”。