在检索查询中定义SQL变量
我有一个递归(使用CTE)查询来获取某个子/孙子的顶级父级。我有一个包含孩子/孙子id的大视图。下面是我的递归查询:在检索查询中定义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
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约束查询计划而不尝试使用变量时,是否查看了该查询计划以从视图中进行选择?