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

时间:2016-02-11 10:35:42

标签: oracle left-join connect-by

以下查询显示,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;

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

2 个答案:

答案 0 :(得分:0)

我相信您要查找的文档可以在此处找到:Hierarchical Queries

最相关的部分:

  

Oracle按如下方式处理分层查询:

     
      
  • 首先评估连接(如果存在),无论是在FROM子句中还是在WHERE子句谓词中指定了连接。

  •   
  • 评估CONNECT BY条件。

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

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

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

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

  4.   
  5. Oracle选择连续几代子行。 Oracle首先选择步骤2中返回的行的子项,然后选择这些子项的子项,依此类推。 Oracle总是通过评估关于当前父行的CONNECT BY条件来选择子项。

  6.   
  7. 如果查询包含没有连接的WHERE子句,则Oracle会从层次结构中删除不满足WHERE子句条件的所有行。 Oracle单独评估每一行的这种情况,而不是删除不满足条件的行的所有子项。

  8.   
  9. Oracle按照图9-1中显示的顺序返回行。在图中,孩子出现在父母的下方。有关分层树的说明,请参见图3-1,"分层树"。

  10.   

答案 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
;