在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) 在表上执行时,使用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做这个?
这是我的(样本)架构.请注意,虽然层次结构本身很简单,但还有一个额外的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) PostgreSQL在Oracle中是否有像"LEVEL"这样的伪列?
如果没有,那么我们如何创建一个类似于"LEVEL"的列?
oracle postgresql connect-by recursive-cte hierarchical-query
给出一个简单的(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) 以下查询显示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 [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) 关系模型是
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代码结构,我正在尝试转换为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) 我在Oracle 9i数据库表中有一个父子关系
喜欢:
parent | child
1 | 2
2 | 3
2 | 4
null | 1
1 | 8
Run Code Online (Sandbox Code Playgroud)
我需要得到一个给定孩子的绝对父母.说,我有孩子4,它必须给我父母:1
我已经看过CONNECT BY,但我找不到解决方案.
connect-by ×10
oracle ×10
sql ×6
plsql ×2
postgresql ×2
hierarchy ×1
left-join ×1
oracle11gr2 ×1
oracle9i ×1
siblings ×1
simulation ×1
sql-server ×1
tree ×1