SQL Server 2005 には、ツリーの最上位に到達するまで各アイテムの親を取得するテーブルをループするループがあります。
DECLARE @T Table
(
ItemID INT NOT NULL PRIMARY KEY,
AncestorID INT NULL
)
次のようなデータがあります。
ItemID | AncestorID
1 2
2 3
3 4
4 NULL
基本的にこれを行うループがあります。
DECLARE @AncestorID INT
SELECT @AncestorID = 1
WHILE (@AncestorID IS NOT NULL)
BEGIN
--Do some work
SELECT @AncestorID = T.AncestorID
FROM @T t
WHERE T.ItemID = @AncestorID
print @AncestorID
END
(はい、SQL はセットベースであり、これは行ごとに処理していることを知っています。理由により、「いくつかの作業を行う」を行ごとに実行する必要があります)。
これは、最終的に無限ループに陥る今日まで、常に正常に機能していました。原因はいくつかの間違ったデータであることがわかりました:
ItemID | AncestorID
1 2
2 3
4 NULL
ItemID
3を削除しました。ループは決して終了しないため、ループは決して終了しません。ループはAncestorID
3NULL
のままです。
クエリが 0 行を返す場合に select ステートメントを書き直して@AncestorID
nullにする方法はありますか、またはレコードといくつかの型ロジックをカウントする別のステートメントが必要ですか?SELECT
SELECT
IF ELSE