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 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 * 没有。 并添加 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 组合的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL:SELECT 语句中的内联表?

oracle 查看视图

树的遍历

asterisk 安装 方法 顺序

Asterisk-java-1.0.0.m3.jar 和 Asterisk 11 问题

asterisk怎么配置IVR