2012-09-26 3 views
4

부모가 아닌 모든 자녀를 검색하려고합니다.부모가 아닌 모든 자녀 찾기

표는 내가

SELECT * 
FROM [SMD].[dbo].[ProposalFollowUp] 
WHERE ID NOT IN (SELECT ParentID FROM [SMD].[dbo].[ProposalFollowUp]) 

을 시도 처음에는이

ID | ParentID 
--------------- 
1  NULL 
2   1 
3  NULL 
4   2 

처럼 보이지만 그것은 어떤 행을 반환하지 않습니다. parentID에없는 모든 행을 선택하려고했습니다. 왜 작동하지 않는지 나는 이해할 수 없다.

그때 나는이

SELECT * 
FROM [SMD].[dbo].[ProposalFollowUp] AS a 
WHERE a.ID NOT IN 
(SELECT b.ID FROM [SMD].[dbo].[ProposalFollowUp] as b WHERE b.ParentID = a.ID) 

을 시도하지만이 모든 행

누구든지 내가

감사합니다 누락 무엇을 말해 줄 수를 반환!

답변

7

은 잘 알려진 SQL의 특질 노출

WHERE ID NOT IN (null, 1, null, 2) 

을 그리고 그로 변환 :

where id <> null and id <> 1 and id <> null and id <> 2 

트릭 id <> null이 절대로 사실이 아닙니다. SQL의 three-valued logic에서는 unknown으로 평가됩니다. 그리고 그것은 where 절이 결코 어떤 행도 승인하지 않는다는 것을 의미합니다.

이 문제를 해결하기 위해, 하위 쿼리에서 nullexists (팀 Schmelter의 대답과 같은)를 사용하거나 제외 :

WHERE ID NOT IN (
    SELECT ParentID FROM [SMD].[dbo].[ProposalFollowUp] WHERE ParentID IS NOT NULL) 
+0

+1 큰 설명을 위해 !!! 고마워요. – Marc

+0

+1, 제가 말하려고했던 것입니다. 좋은 설명. –

1
SELECT * 
FROM [SMD].[dbo].[ProposalFollowUp] 
WHERE ID NOT IN (SELECT ParentID FROM [SMD].[dbo].[ProposalFollowUp] WHERE ParentID IS NOT NULL) 
+0

상위 항목은 상위 항목입니다. 그래서 그들은 부모를 가질 수 있지만 자식이 없습니다 – Marc

+0

@Marc 내 업데이트 된 답변을 참조하십시오. –

3

당신은 NOT EXISTS을 사용할 수 있습니다 다음 ID 다른 행의 ParentID없는 경우

SELECT ID, ParentID 
FROM [SMD].[dbo].[ProposalFollowUp] t1 
WHERE NOT EXISTS 
(
    SELECT 1 FROM [SMD].[dbo].[ProposalFollowUp] t2 
    WHERE t2.ParentID = t1.ID 
) 

이 행만을 반환합니다. 그러므로 이것은 부모가 아닙니다.

WHERE ID NOT IN (SELECT ParentID FROM [SMD].[dbo].[ProposalFollowUp]) 

는 이유를 이해하려면, exand 쿼리 : not in를 사용

+0

+1 빠른 답장. 고마워요 – Marc

1

그것을 작동하지 않는 이유.

당신은 첫 번째 쿼리에서 행이 검색되지 않습니다

: 때문에 술어 거기 ParentID에서 NULL

SELECT * 
FROM [SMD].[dbo].[ProposalFollowUp] 
WHERE ID NOT IN (SELECT ParentID FROM [SMD].[dbo].[ProposalFollowUp]) 

따라서 UNKNOWN된다 아무 것도 반환하지 않습니다, 당신은 NOT EXISTS를 사용하여이 문제를 방지 할 수 있습니다

SELECT * 
FROM [SMD].[dbo].[ProposalFollowUp] 
WHERE NOT EXISTS (SELECT ParentID FROM [SMD].[dbo].[ProposalFollowUp]) 

sql NOT EXISTS의 다른 모든 조건자는 두 값 논리에서 작동합니다.및 FALSE 값이 존재하거나 존재하지 않는 경우에만 두 가지 가능성이 있기 때문에 UNKNOWN을 반환 할 방법이 없습니다. 또 다른 해결 방법도 있습니다

, 그건 당신이 당신에게 당신이

찾고있는 결과를 얻을 수 없습니다 AND ParentID IS NOT NULL를 사용하여 이러한 NULL 값을 제거함으로써하지만 경우에, 당신의 경우에 찾고있는 것을받지 않습니다
+0

'존재하지 않는 곳은 어디입니까?' 그것은 SQL이라고 생각하지 마십시오;) – Andomar

+0

이것은 오타라고 생각합니다 :'존재하지 않는 곳 ** ** (SELECT ... ' –

+1

불행히도'id가 존재하지 않습니다'는 SQL이 아닙니다. 서브 쿼리의'where' 절 – Andomar

0

당신은 (누가 부모되지 않음), 당신은 또한 사용할 수있는 자녀의 ID를 원하는 경우 EXCEPT :

SELECT ID 
FROM [SMD].[dbo].[ProposalFollowUp] 

EXCEPT 

SELECT ParentID 
FROM [SMD].[dbo].[ProposalFollowUp] ; 
0

Relace =에 <>

SELECT * 
FROM [SMD].[dbo].[ProposalFollowUp] AS a 
WHERE a.ID NOT IN 
(SELECT b.ID FROM [SMD].[dbo].[ProposalFollowUp] as b WHERE b.ParentID <> a.ID) 
관련 문제