SQL Server递归查询无法正常工作

时间:2015-08-07 06:25:36

标签: sql sql-server sql-server-2008-r2 recursive-query

我有一个包含三列的表

unified_id
master_id
(the third column is a primary key identity)

对于可以在任一id列中的id,我想找到一组id。 例如,如果数据看起来像这样

X001,X123
X002,X123
X123,X123

然后从X001开始我想以X001, X002 and X123的集合返回。同样,我想要从任何成员开始的相同集合。

我们可以假设集合由unified_id列中的值组成,也就是说我们假设总有一行像第三行一样,将主id与自身相关联。

当我只有一行时,后续查询会达到最大递归级别,所以我坦率地不知道如何使用递归查询来解决这个问题。

2BM0000023, 1TE0000111

代码:

CREATE TABLE link_unified_id
 (unified_id         VARCHAR(16)     NOT NULL,
  master_id   VARCHAR(16)     NOT NULL
 );

insert into  link_unified_id values ('X001','X123');
insert into  link_unified_id values ('X002','X123');
insert into  link_unified_id values ('X003','X123');
insert into  link_unified_id values ('X123','X123');
insert into  link_unified_id values ('X999','X999');



with cte1 ( unified_id) as 
    (
        select 
            up1.unified_id 
        from 
            link_unified_id as up1 
        where 
            up1.unified_id =  'X001'

        union all

        select 
            up2.unified_id 
        from 
            link_unified_id as up2
        inner join 
            cte1 on up2.unified_id = cte1.unified_id
    )
    select *   
    from cte1 

/* hoping to see output like this:
X001
X002
X003
X123
*/

2 个答案:

答案 0 :(得分:0)

也许我没有得到它,但为什么不使用该主ID将所选项目中的主ID加入同一个表?

这样的事情:

select lu1.unified_id
  from link_unified_id lu1,
       link_unified_id lu2
 where lu1.master_id = lu2.master_id
   and lu2.unified id = 'X001' 

答案 1 :(得分:0)

在我看来,我的要求是构建一个“无向图”,然后在其中找到路径(不确定术语是什么),这在SQL中的解决方案是相当程序化的(例如Recursive CTE in presence of circular references )。我决定通过Python库插入这些对来实际构建图形,这似乎比在SQL中尝试这样做更优雅。