如何查找 'MAIN' 主记录 SQL

How to find 'MAIN' master record SQL

我是运行一个查询:

    SELECT
        parent_company_component_id
        ,company_component_id
        ,name
        ,valid_cpy_compnt_type_cs_name
    FROM dbo.cs_company_component
    WHERE company_component_id IN (10217,7726,3109)

其中 return 结果如下:

我只是碰巧知道这些 ID 并将它们用于此示例。

我怎样才能 return 将关联的公司全面分组在一起,直到我到达 'MAIN' 公司。

还有其他几家我不知道 ID 的公司我希望能够将这些结果基本上组合在一起,这样我就可以继续获得主要公司 return 及其父子关联.

我刚刚设法让我的 CTE 正常工作

WITH CTE AS
(
        SELECT
        parent_company_component_id
        ,company_component_id
        ,name
        ,valid_cpy_compnt_type_cs_name
        ,1 AS level
    FROM dbo.cs_company_component
    WHERE parent_company_component_id IS NULL
    --AND valid_cpy_compnt_type_cs_name = 'MAIN'

    UNION ALL

    SELECT X.parent_company_component_ID, X.company_component_id, x.name, x.valid_cpy_compnt_type_cs_name, CTE.level+1 as Level
   FROM CTE
   JOIN cs_company_component AS X ON X.parent_company_component_id = CTE.company_component_id --AND X.valid_cpy_compnt_type_cs_name = 'MAIN'
)
SELECT * FROM CTE
ORDER BY Level ASC

您可以使用递归 CTE 遍历关系。

它允许您添加额外的内容,例如基本 ID 和级别计数器。

WITH RCTE_COMP_COMP AS
(
  -- The seed query to start the recursion
  SELECT 
   t.company_component_id AS base_id
 , ​t.name AS base_name
 ​, 1 AS lvl
 ​, t.parent_company_component_id
 ​, t.company_component_id
 ​, t.name
 ​, t.valid_cpy_compnt_type_cs_name
 ​FROM dbo.cs_company_component t
 ​WHERE t.parent_company_component_id IS NULL

 ​UNION ALL
 ​
 ​-- The query where the CTE uses itself
 ​SELECT
   cte.base_id
 , cte.base_name
 , cte.lvl + 1
 ​, t.parent_company_component_id
 ​, t.company_component_id
 ​, t.name
 ​, t.valid_cpy_compnt_type_cs_name
 ​FROM RCTE_COMP_COMP AS cte
 ​JOIN dbo.cs_company_component AS t 
   ​ON t.parent_company_component_id = cte.company_component_id
) 
SELECT * 
FROM RCTE_COMP_COMP cte
ORDER BY cte.base_id, cte.lvl