标签: connect-by

与Oracle的CONNECT BY等效的PostgreSQL语法是什么?START WITH?

Oracle中,如果我将表定义为...

CREATE TABLE taxonomy
    (
    key NUMBER(11) NOT NULL CONSTRAINT taxPkey PRIMARY KEY,
    value VARCHAR2(255),
    taxHier NUMBER(11)
    );
ALTER TABLE
    taxonomy
ADD CONSTRAINT
    taxTaxFkey
FOREIGN KEY
    (taxHier)
REFERENCES
    tax(key);
Run Code Online (Sandbox Code Playgroud)

有了这些价值......

key value   taxHier
0   zero    null
1   one     0
2   two     0
3   three   0
4   four    1
5   five    2
6   six     2
Run Code Online (Sandbox Code Playgroud)

这个查询语法......

SELECT
     value
FROM
    taxonomy
CONNECT BY
    PRIOR key = taxHier
START WITH
    key = 0;
Run Code Online (Sandbox Code Playgroud)

会屈服......

zero
one
four
two
five
six
three …
Run Code Online (Sandbox Code Playgroud)

sql oracle postgresql connect-by recursive-query

16
推荐指数
2
解决办法
3万
查看次数

为什么表上的CONNECT BY LEVEL会返回额外的行?

在表上执行时,使用CONNECT BY LEVEL似乎返回太多行.发生了什么事情背后的逻辑是什么?

假设如下表:

create table a ( id number );

insert into a values (1);
insert into a values (2);
insert into a values (3);
Run Code Online (Sandbox Code Playgroud)

此查询返回12行(SQL Fiddle).

 select id, level as lvl
   from a
connect by level <= 2
  order by id, level
Run Code Online (Sandbox Code Playgroud)

表A中每行一行,列LVL的值为1,表LV中的每一行为3,其中列LVL为2,即:

ID | LVL 
---+-----
 1 |  1 
 1 |  2 
 1 |  2 
 1 |  2 
 2 |  1 
 2 |  2 
 2 |  2 
 2 |  2 
 3 |  1 
 3 | …

sql oracle connect-by

14
推荐指数
2
解决办法
7万
查看次数

计算其父项拥有的根的百分比

简单来说,我正在尝试计算其父项所拥有的树的根的百分比,进一步在树上.我怎么能单独用SQL做这个?

这是我的(样本)架构.请注意,虽然层次结构本身很简单,但还有一个额外的holding_id,这意味着单个父母可以"拥有"他们孩子的不同部分.

create table hierarchy_test ( 
       id number -- "root" ID
     , parent_id number -- Parent of ID
     , holding_id number -- The ID can be split into multiple parts
     , percent_owned number (3, 2)
     , primary key (id, parent_id, holding_id) 
        );
Run Code Online (Sandbox Code Playgroud)

还有一些样本数据:

insert all 
 into hierarchy_test values (1, 2, 1, 1) 
 into hierarchy_test values (2, 3, 1, 0.25)
 into hierarchy_test values (2, 4, 1, 0.25)
 into hierarchy_test values (2, 5, 1, 0.1)
 into hierarchy_test values (2, 4, …
Run Code Online (Sandbox Code Playgroud)

sql oracle connect-by hierarchy oracle11gr2

13
推荐指数
2
解决办法
893
查看次数

PostgreSQL在Oracle中是否有像"LEVEL"这样的伪列?

PostgreSQL在Oracle中是否有像"LEVEL"这样的伪列?
如果没有,那么我们如何创建一个类似于"LEVEL"的列?

oracle postgresql connect-by recursive-cte hierarchical-query

10
推荐指数
2
解决办法
7992
查看次数

在oracle树查询中加入其他表

给出一个简单的(id,description)表t1,例如

id  description
--  -----------
1   Alice
2   Bob
3   Carol
4   David
5   Erica
6   Fred
Run Code Online (Sandbox Code Playgroud)

和父子关系表t2,如

parent  child
------  -----
1       2
1       3
4       5
5       6
Run Code Online (Sandbox Code Playgroud)

Oracle提供了一种将此方法作为具有一些自定义语法扩展的树遍历的方法:

select parent, child, sys_connect_by_path(child, '/') as "path"
from t2
connect by prior parent = child
Run Code Online (Sandbox Code Playgroud)

确切的语法并不重要,我可能在上面做了一个错误.重要的是上面会产生一些看起来像的东西

parent  child  path
------  -----  ----
1       2      /1/2
1       3      /1/3
4       5      /4/5
4       6      /4/5/6
5       6      /5/6
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否可以在sys_connect_by_path()中连接另一个表,例如上面的t1表,以生成类似于:

parent  child  path
------  -----  ----
1       2      /Alice/Bob
1       3 …
Run Code Online (Sandbox Code Playgroud)

sql oracle tree connect-by

8
推荐指数
2
解决办法
9712
查看次数

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

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

oracle connect-by left-join

7
推荐指数
1
解决办法
304
查看次数

除Oracle之外的RDBMS中的CONNECT BY或分层查询

Oracle提供了非常方便的功能.您可以使用以下子句创建分层查询(递归行为):

CONNECT BY [NOCYCLE] {condition [AND condition...]} [START WITH condition]
Run Code Online (Sandbox Code Playgroud)

如此处所述:

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries003.htm

我想知道,有没有其他已建立的RDBMS支持等效或类似的语法?或者可以使用常规SQL一般模拟这样的递归行为?

我希望能够模拟的一个很好的例子是(取自Oracle文档):

    SELECT LPAD(' ', 2 * (LEVEL-1)) || last_name org_chart, 
           employee_id, manager_id, job_id
      FROM employees
START WITH job_id = 'AD_VP' 
CONNECT BY PRIOR employee_id = manager_id; 
Run Code Online (Sandbox Code Playgroud)

导致:

ORG_CHART          EMPLOYEE_ID MANAGER_ID JOB_ID
------------------ ----------- ---------- ----------
Kochhar                    101        100 AD_VP
  Greenberg                108        101 FI_MGR
    Faviet                 109        108 FI_ACCOUNT
    Chen                   110        108 FI_ACCOUNT
    Sciarra                111        108 FI_ACCOUNT
    Urman                  112        108 FI_ACCOUNT
    Popp                   113        108 FI_ACCOUNT
  Whalen                   200        101 AD_ASST …
Run Code Online (Sandbox Code Playgroud)

sql oracle simulation connect-by recursive-query

6
推荐指数
2
解决办法
6113
查看次数

如何使用Oracle CONNECT BY将层次结构中的所有值链接到某个值

关系模型是

1   3   
 \ / \
  2   4
   \
    7   5     8
     \ /     /
      6     9
Run Code Online (Sandbox Code Playgroud)

表是:

select 2 child, 1 father from dual
union all
select 2 child, 3 father from dual
union all
select 4 child, 3 father from dual
union all
select 7 child, 2 father from dual
union all
select 6 child, 5 father from dual
union all
select 6 child, 7 father from dual
union all
select 9 child, 8 father from dual
Run Code Online (Sandbox Code Playgroud)

如何将所有值与值CHILD或FATHER …

oracle plsql connect-by

6
推荐指数
1
解决办法
1971
查看次数

SQL Server等效于Oracle的"CONNECT BY PRIOR"和"ORDER SIBLINGS BY"

我有这个Oracle代码结构,我正在尝试转换为SQL Server 2008 (注意:我在方括号'[]'中使用了通用名称,封闭的列名和表名,并做了一些格式化以使代码更多可读):

SELECT [col#1], [col#2], [col#3], ..., [col#n], [LEVEL] 
FROM (SELECT [col#1], [col#2], [col#3], ..., [col#n] 
      FROM [TABLE_1] 
      WHERE ... ) 
CONNECT BY PRIOR [col#1] = [col#2] 
START WITH [col#2] IS NULL 
ORDER SIBLINGS BY [col#3]
Run Code Online (Sandbox Code Playgroud)

什么是上述代码的SQL Server等效模板

具体来说,我正在努力与LEVEL和'ORDER SIBLINGS BY'Oracle构造.

注意: 上面的"代码"是一组Oracle过程的最终输出.基本上,'WHERE'子句是动态构建的,并根据传递的各种参数而变化.以"CONNECT BY PRIOR"开头代码块是硬编码的.


以供参考:

SQL SERVER文章中关于ORACLE的连接模拟很接近,但它没有解释如何处理'LEVEL'和'ORDER SIBLINGS'结构.......我的思绪在变化!

SELECT name 
  FROM emp
  START WITH name = …
Run Code Online (Sandbox Code Playgroud)

sql-server oracle connect-by recursive-query siblings

6
推荐指数
1
解决办法
2万
查看次数

oracle 9i获得给定孩子的树的最高成员

我在Oracle 9i数据库表中有一个父子关系

喜欢:

parent | child  
1      | 2  
2      | 3
2      | 4
null   | 1
1      | 8
Run Code Online (Sandbox Code Playgroud)

我需要得到一个给定孩子的绝对父母.说,我有孩子4,它必须给我父母:1

我已经看过CONNECT BY,但我找不到解决方案.

sql oracle plsql connect-by oracle9i

5
推荐指数
1
解决办法
1752
查看次数