在检索查询中定义 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
我有一个递归(使用 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