2012-01-04 93 views
3

我有一个项目ID和一个'inherit id'的记录,即当前项目继承的项目。继承级别未知。SQL递归记录:如何折叠为“仅限一个级别”?

我现在需要折叠此于:

例如, '从最顶部的继承':

1006 <- 1005 <- 1002 <- 999 

prj_id/inherit_id

999/1002 

1002/1005 

1005/1006 

应崩

1006 <- 1005 

1006 <- 1002 

1006 <- 999 

prj_i d/inherit_id

999/1006 

1002/1006 

1005/1006 

这可以在没有循环的SQL语句中完成吗? 创建临时表很好。 应该为火鸟,SQL Server的工作,甲骨文9+(即3套报表是罚款)

我只得到了这么远:

,从本身的纪录继承记录再次继承:

select tt_prj_id,tt_name,tt_inherit_id from tt_prj a 

where a.tt_inherit_id in 

(select tt_prj_id from tt_prj b 

where b.tt_inherit_id is not null 

and b.tt_inherit_id > 0) 

谁能帮我进一步?

+0

据我所知,甲骨文是支持[分层查询]唯一的引擎(http://docs.oracle .com/cd/B19306_01/server.102/b14200/queries003.htm)。 – dasblinkenlight 2012-01-04 13:48:23

+0

在MYSQL中,你也可以使用group_concat函数。 – 2012-01-04 13:54:37

+2

“根”项目具有什么作为inherit_id? – Alex 2012-01-04 13:56:24

回答

6

像下面这样的东西应该让你开始(这不是最终的解决方案!):

with recursive project_tree as (
    select tt_prj_id, cast(tt_prj_id as varchar(500))||'/' as id_path, tt_prj_id as root_id 
    from tt_prj 
    where tt_inherit_id = 0 

    union all 

    select c.tt_prj_id, id_path || cast(c.tt_prj_id as varchar(100)) ||'/', null 
    from tt_prj c 
    join project_tree p on c.tt_inherit_id = p.tt_prj_id 
) 
select * 
from project_tree; 

这工作火鸟2.5(可能也有2.1的工作,但我没有一个在手,现在)

当你删除关键字recursive(这是ANSI标准所要求的,但是从什么时候开始Microsoft关心那个...)并且你需要用标准字符串连接||替换+运营商。

Oracle只支持11.2之前的递归CTE。 在以前的版本中,你需要重写这个使用CONNECT BY,这woudl是这样的:

select tt_prj_id, tt_inherit_id, sys_connect_by_path(tt_prj_id, '/') 
from tt_prj 
start with tt_inherit_id = 0 
connect by prior tt_prj_id = tt_inherit_id; 
+0

我认为'||'必须替换为'+'的代码才能在tsql中工作(半个问题,半个评论在这里......从来没有在tsql中看到过这个操作符bef矿石) – Alex 2012-01-04 15:54:26

+0

@Alex:正确我总是忘记了微软也违反了SQL规则。 – 2012-01-04 16:02:07

+0

是否有某些原因需要连接?如果你要做的只是“根”节点和“当前”节点,那么根可以简单地传播。 – 2012-01-04 17:08:58

1

transitive closure tablesnested sets上进行搜索。它们的结构使得高效地查询关系数据成为可能,但是对插入/更新/删除需要更多的维护,并且闭包表需要存储额外的记录(效率的折衷空间)。

+0

感谢Sam,但是没有必要在应用程序中拥有正确的嵌套数据库结构,这只是一次性更新脚本对于一个表在当前数据结构上运行,下一个应用程序版本只允许一个继承 – 2012-01-04 14:07:00

+0

好吧,不知道你如何使用'n'级关系来表,然后编写没有循环的SQL。 .. – Sam 2012-01-04 14:17:53