【发布时间】:2019-11-27 16:56:15
【问题描述】:
我有一个查询,它使用 itemnum 并搜索表以找到链中没有任何 replacementItemNum 的 itemnum。
就像一条链,a属于b,b属于c,需要在链中找到不属于任何人的字母。
表有 72k 条记录。
如果我通过 A 或 B 或 C,我会得到字母 D,因为它没有任何替换项。
如果我通过 D,那么结果将为 NULL
这是数据(链)的样子:
ItemNum - ReplacementItemNum
----------------------------
A - B
B - C
C - D
D -
此查询耗时过长;可以重写一下,这样就不用那么长时间了?
DECLARE @CountryOID INT = 250 ,
@ItemNum VARCHAR(50) = 'A';
DECLARE @LastItem VARCHAR(50);
DECLARE @NextItem VARCHAR(50);
SELECT @LastItem = ReplaceItemNum
FROM dbo.MacInventory
WHERE ItemNum = @ItemNum
AND CountryOID = @CountryOID;
WHILE @LastItem <> ''
BEGIN
SET @NextItem = @LastItem;
SELECT @LastItem = ReplaceItemNum
FROM dbo.MacInventory
WHERE ItemNum = @LastItem
AND CountryOID = @CountryOID;
END;
SELECT @NextItem;
【问题讨论】:
-
我猜递归 CTE 会比循环表现更好 - sommarskog.se/arrays-in-sql-2005.html#CTEs
标签: sql sql-server data-analysis