-- 定义参数(实际使用时,需为 @PartNumber 赋值)
DECLARE @pITEM_CODE VARCHAR(30);
SET @pITEM_CODE = '390100014'; -- 示例值,替换为实际元件品号ID
WITH BomCTE
AS (
   -- Anchor成员:获取给定元件品号的直接父件(第一层主件)
   SELECT b.ITEM_ID AS Parent_ITEM_ID, -- 父件品号ID
          0 AS Level,
          d.SOURCE_ID_ROid Son_ITEM_ID
   FROM [BOM_D] d
       INNER JOIN [BOM] b
           ON d.BOM_ID = b.BOM_ID -- 关联BOM主件
       INNER JOIN dbo.ITEM AS i
           ON i.ITEM_BUSINESS_ID = d.SOURCE_ID_ROid
   WHERE i.ITEM_CODE = @pITEM_CODE -- 参数:元件品号ID
   UNION ALL
   -- 递归成员:向上遍历,查找当前父件的更上层父件
   SELECT b.ITEM_ID AS Parent_ITEM_ID, -- 更上层父件品号ID
          cte.Level + 1 AS Level,
          cte.Son_ITEM_ID
   FROM BomCTE cte
       INNER JOIN [BOM_D] d
           ON cte.Parent_ITEM_ID = d.SOURCE_ID_ROid -- 当前父件作为元件在更高层中
       INNER JOIN [BOM] b
           ON d.BOM_ID = b.BOM_ID -- 关联更高层的主件
   WHERE cte.Level <= 20 -- 安全限制,防止无限循环
)
-- 最终输出:所有在CTE中且没有更上层父件的顶层主件品号
SELECT DISTINCT
       c.Son_ITEM_ID,
       i2.ITEM_CODE Son_ITEM_CODE,
       i2.ITEM_NAME Son_ITEM_NAME,
       i.ITEM_BUSINESS_ID,
       i.ITEM_CODE, -- 顶层主件品号
       i.ITEM_NAME  -- 顶层主件品名
FROM BomCTE c
    INNER JOIN [ITEM] AS i
        ON c.Parent_ITEM_ID = i.ITEM_BUSINESS_ID -- 关联品号资料表获取品号信息
    INNER JOIN dbo.ITEM AS i2
        ON i2.ITEM_BUSINESS_ID = c.Son_ITEM_ID
WHERE NOT EXISTS
(
    SELECT 1 FROM [BOM_D] d2 WHERE d2.SOURCE_ID_ROid = c.Parent_ITEM_ID -- 检查Parent_ITEM_ID是否在其他BOM中作为元件(如果有,说明不是顶层)
)
ORDER BY i2.ITEM_CODE,
         i.ITEM_CODE