【发布时间】:2017-07-11 09:12:49
【问题描述】:
我写了一个相当简单的递归 CTE 语句。目的是查找一个结构并返回顶层项目
这里是代码
WITH cte_BOM(parent_serial_id, serial_id, serial_batch_no, sort)
AS (SELECT BOM.parent_serial_id, BOM.serial_id, p.serial_batch_no, 1
FROM serial_status AS BOM
INNER JOIN item_serial_nos p ON BOM.parent_serial_id = p.serial_id
WHERE BOM.serial_id = '16320' AND BOM.is_current = 'Y'
UNION ALL
SELECT
BOM1.parent_serial_id, bom1.serial_id, p1.serial_batch_no, cte_BOM.sort + 1
FROM cte_BOM
INNER JOIN serial_status AS BOM1 ON cte_BOM.parent_serial_id =
BOM1.serial_id
INNER JOIN item_serial_nos p1 ON BOM1.parent_serial_id = p1.serial_id
WHERE BOM1.is_current = 'Y'
)
SELECT TOP 1
cte_BOM.*
FROM
cte_BOM
ORDER BY sort desc
如您所见,我现在只是硬编码serial_id。我现在需要完成的是针对数据子集运行此 cte。我现在被困在如何做到这一点上。
因此,我将通过另一个 select 语句生成一个 serial_ids 列表,然后为每一行使用这个 serial_id 代替当前硬编码的那些并返回第一条记录。重要的是,如果 serial_id 没有仍应返回行的父级
第二个SELECT 是这样的:
SELECT serial_id
FROM
item_serial_nos
WHERE
item_serial_nos.item_id = '15683'
任何建议表示赞赏。 (使用 SQL 2008 R2)
【问题讨论】:
标签: sql recursion sql-server-2008-r2 common-table-expression