SQL Server 2008 でレコードが表示されないのはなぜですか?
;with pricedCategories as
(
select * from Product.Category where CategoryID not in
(select Parent_CategoryID from Product.Category)
)
select * from pricedCategories
SQL Server 2008 でレコードが表示されないのはなぜですか?
;with pricedCategories as
(
select * from Product.Category where CategoryID not in
(select Parent_CategoryID from Product.Category)
)
select * from pricedCategories
CTE内のサブクエリにNULL値がある場合、クエリは値を返さないようです(insert(1、NULL)のNULLを(1、0)としましょう)クエリが機能します)。NULL 値を使用しても他のカテゴリの親ではないカテゴリを取得する場合は、次のように実行できます。
DECLARE @Category TABLE (CategoryID INT, Parent_CategoryID INT)
INSERT @Category VALUES
(1, NULL),
(2, 1),
(3, 1),
(4, 2)
;WITH pricedCategories AS
(
SELECT * FROM @Category y WHERE NOT EXISTS
(SELECT Parent_CategoryID FROM @Category x
WHERE x.Parent_CategoryID = y.CategoryID)
)
SELECT * FROM pricedCategories
次のアプローチが、質問で説明されているアプローチと同じように機能することは興味深いことです。
;WITH pricedCategories AS
(
SELECT * FROM @Category y
WHERE y.CategoryID <> ALL(SELECT DISTINCT Parent_CategoryID FROM @Category)
)
SELECT * FROM pricedCategories
次のように、ISNULL 関数を使用して NULL を CategoryID として使用されない数値に置き換えるようにクエリを変更できます。
;WITH pricedCategories AS
(
SELECT * FROM @Category WHERE CategoryID NOT IN
(SELECT ISNULL(Parent_CategoryID, -1) FROM @Category)
)
SELECT * FROM pricedCategories
ただし、「何もない」ことを意味する NULL 値は実際の値 -1 に変更されますが、これは正しくないため、使用しないでください。