次の表を検討してください。
SELECT [ItemID]
,[ParentID]
,[PolicyID]
,[PolicyRoot]
FROM [AdventureWorks2008R2].[dbo].[Example]
ItemID ParentID PolicyID PolicyRoot
----------- ----------- ---------- ----------
1 NULL default 1
2 1 b 1
3 1 c 0
4 NULL d 1
5 3 e 0
6 3 f 1
7 NULL g 0
から使用する必要がある場合に備えてPolicyID
、各項目からを選択しようとしています。これは再帰的です...PolicyRoot = 1
PolicyRoot = 0
PolicyID
ParentID
関数の操作:
CREATE FUNCTION dbo.Policies(@ItemID INT) RETURNS VARCHAR(10)
AS
BEGIN
DECLARE @ParentID INT, @PolicyRoot BIT, @PolicyID VARCHAR(10)
SELECT @ParentID = ParentID
, @PolicyRoot = PolicyRoot
, @PolicyID = PolicyID
FROM [dbo].[Example]
WHERE ItemID = @ItemID
IF @PolicyRoot != 1
SELECT @PolicyID = dbo.Policies(@ParentID)
RETURN @PolicyID
END;
GO
SELECT ItemID
, dbo.Policies(ItemID) AS Policy
FROM [dbo].[Example];
ItemID Policy
----------- ----------
1 default
2 b
3 default
4 d
5 default
6 f
7 NULL
この関数を CTE に書き直そうとしていますが、まだ CTE の知識がありません。複数の CTE を読みましたが、条件付き CTE を管理する方法がまったくわかりません。これは私が得た限りであり、UNION ALL
.
WITH Policies (ItemID, PolicyID) AS (
SELECT ItemID
, PolicyID
FROM dbo.Example
UNION ALL
...
)
SELECT ItemID
, PolicyID
FROM Policies;
そのようなCTEがどのように機能するかを簡単な手順で説明し、正しい方向に私を押し進めることができますか?