在 table 中递归查找链接行

Find Linked Rows recursively in a table

我有一个 table,其中包含多个列,其中 ID 和 ORIGID 作为用于 link 两条记录的列。

输入新记录时,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 搜索时,它应该 return 所有行 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;

但它 return 只是第一行和最后一行。

试试这个:

    ;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