Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在检索查询中定义SQL变量_Sql_Common Table Expression - Fatal编程技术网

在检索查询中定义SQL变量

在检索查询中定义SQL变量,sql,common-table-expression,Sql,Common Table Expression,我有一个递归(使用CTE)查询来获取某个子/孙子的顶级父级。我有一个包含孩子/孙子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

我有一个递归(使用CTE)查询来获取某个子/孙子的顶级父级。我有一个包含孩子/孙子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
,以检索父级/父级(顶级父级是什么)一个查询中的所有记录,而不需要分别为视图的每一行运行递归函数?

如果您将基本子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

当您通过该ID约束查询计划而不尝试使用变量时,是否查看了该查询计划以从视图中进行选择?