在表中递归查找链接的行

问题描述 投票:0回答:1

我有一个表,其中包含具有ID和ORIGID的多个列作为用于链接两个记录的列。

输入新记录时,ID和ORIGID相同。如果记录数据被修改,它将获得新的ID,但ORIGID指向已修改的先前记录ID。

数据看起来像:

ID      ORIGID
----------------
1        1
2        1
3        2
4        4
5        3
6        6
7        5
8        8
9        9
10       7

我正在寻找一个有效的查询,当我搜索ID为10的记录(结果应包括10、7、5、3、2、1)时,我应该能够看到所有相关记录。当我用ID 5搜索时,应该返回所有行5,3,2,1

我尝试过的查询是:

WITH
CTE
AS
(
select  ID, ORIGID     from    t
where   ID = 10

UNION ALL

select  child.ORIGID
    , CASE WHEN parent.ID = child.ORIGID THEN child.ID ELSE NULL END AS prev
from
    t AS child
    inner join CTE AS parent on
        (parent.ORIGID = child.ID)
)
SELECT * FROM CTE;

但是它仅返回第一行和最后一行。

sql sql-server recursive-query
1个回答
1
投票

尝试一下:

    ;WITH #results AS
    (
        SELECT  id, 
                ORIGID 
        FROM    table_name
        WHERE   id = 10
        UNION ALL
        SELECT  t.id, 
                t.ORIGID 
        FROM    table_name t
                INNER JOIN #results r ON r.ORIGID = t.id AND R.ID <> t.id

    )
    SELECT id, ORIGID
    FROM    #results ;

以及用于过去和将来的记录

    ;WITH #results AS
    (
        SELECT  id, ORIGID  FROM  table_name WHERE   id = 2
        UNION ALL
        SELECT  t.id, t.ORIGID FROM    table_name t
                INNER JOIN #results r ON r.ORIGID = t.id AND R.ID <> t.id
    ),#results2 as
    (
      select ID,ORIGID from table_name where ID = 2
      union all
      select t.ID,t.ORIGID from table_name t join #results2 r  on t.ORIGID=r.id AND R.ID <> t.id
    )
    SELECT * FROM #results
    UNION 
    SELECT * FROM #results2
© www.soinside.com 2019 - 2024. All rights reserved.