在检索查询中定义 SQL 变量

Define SQL variable inside the retrieving query

我有一个递归(使用 CTE)查询来获取某个 child/grandchild 的顶级父级。我有一个大视图,其中包含 child/grandchild 的 ID。这是我的递归查询:

DECLARE @childID INT 
SET @childID  = 16579; --child to search

WITH RCTE AS
(
    SELECT *, 1 AS Lvl, Company.CompanyID As Child FROM Company 
    WHERE CompanyID = @childID

    UNION ALL

    SELECT rh.*, Lvl+1 AS Lvl, rh.CompanyID As Child FROM Company rh
    INNER JOIN RCTE rc ON rh.CompanyID = rc.ParentID
)
SELECT TOP 1 p.CompanyID, p.CompanyName, r.Child
FROM RCTE r
inner JOIN Company p ON p.CompanyID= r.ParentID
ORDER BY lvl DESC

有没有一种方法可以在视图中设置 @childID 来检索一次查询中所有记录的总 parent/parent(顶级父项是什么)而不需要 运行视图的每一行分别递归函数?

如果您将基本子 ID 作为 CTE 的一部分包含在内并通过递归的迭代将其传递下去,那么 SQL 引擎应该足够智能以适当地限制它并且您应该获得性能和变量一样好。我只是做了一些快速测试来确认。

一个例子:

CREATE VIEW Company_Hierarcy
AS
    WITH RCTE AS
    (
        SELECT
            C.Name, -- etc., since we never actually use SELECT *
            C.CompanyID,
            C.ParentID,
            1 AS Lvl,
            C.CompanyID AS BaseID
        FROM
            dbo.Company C

        UNION ALL

        SELECT
            C2.Name,
            C2.CompanyID,
            CTE.Lvl+1 AS Lvl,
            CTE.BaseID AS BaseID
        FROM
            RCTE CTE
        INNER JOIN Company C2 ON C2.CompanyID = CTE.ParentID
    )
    SELECT
        R.Name,
        R.CompanyID,
        R.ParentID,
        R.lvl,
        R.BaseID
    FROM
        RCTE R

然后您可以检查以下各项的性能:

SELECT * FROM Company_Hierarcy

对比:

SELECT * FROM Company_Hierarcy WHERE BaseID = 16579