2012-07-07 5 views

답변

3

그것은 내가의 (1 말을하자로) 삽입 (1, NULL NULL을 교체 할 경우 CTE 내부 하위 쿼리에서 NULL 값 (있을 때 쿼리 값을 반환하지 않는 것 같다, 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 

다음과 같은 접근 방식에 설명 된 방법과 동일한 작동하는지 보는 것이 재미있다 질문 : 당신은 ISNULL 함수를 사용하는 쿼리를 변경할 수

;WITH pricedCategories AS 
(
    SELECT * FROM @Category y 
    WHERE y.CategoryID <> ALL(SELECT DISTINCT Parent_CategoryID FROM @Category) 
) 
SELECT * FROM pricedCategories 

이 같은 카테고리 ID로 사용되지 않습니다 일부 숫자 값이 NULL 대체 :

;WITH pricedCategories AS 
(
    SELECT * FROM @Category WHERE CategoryID NOT IN 
    (SELECT ISNULL(Parent_CategoryID, -1) FROM @Category) 
) 
SELECT * FROM pricedCategories 

그러나 "아무것도"를 의미하지 않는 NULL 값은 -1이 아닌 -1의 실제 값으로 변경되어 사용되지 않아야합니다.

+0

나는이 방법을 알고 있지만이 유형의 쿼리를 자주 사용하며이 방법은 너무 직관적이어서 작성하기가 쉽지 않습니다. 그것은 당신의 두뇌를 약간 먹지 만, '안 들어간다'는 것은 아닙니다. – teenup

+1

@puretechy -'NOT IN'을 계속하려면 하위 쿼리에서'NULL' 값을 제외하십시오. 즉. 'CategoryID가 아닌 곳 (Product.Category의 Parent_CategoryID를 선택하십시오. Parent_CategoryID는 NULL이 아닙니다)' –

관련 문제