在 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
我有一个 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