2012-09-06 3 views
0

[PropertyId]에 대한 추가 조인 정보를 추가 할 때 이것이 왜 0 레코드를 반환하는지 설명 할 수 있습니까? 나는 이것이 단순한 것이지만, 나는 손실을 입었다 고 알고있다. 당신이 가입하지 추가 한 경우CTE가 추가 조인 절이 작동하지 않습니다.

declare @ViewId as int; 

set @ViewId = 11; 

with Views 
as 
(
    select [LiveWireView].[Id], [LiveWireView].[Name], [LiveWireView].[ParentId], [PropertyToViewMap].[PropertyId] 
    from [LiveWireView] 
    inner join [PropertyToViewMap] on [PropertyToViewMap].[ViewId] = [LiveWireView].[Id] 
    where [LiveWireView].[Id] = @ViewId 
    union all 
    select [v].[Id], [v].[Name], [v].[ParentId], [p].[PropertyId] 
    from [LiveWireView] v 
    inner join [PropertyToViewMap] p on [p].[ViewId] = [v].[Id] 
    inner join Views on Views.Id = v.ParentId 
) 

select [PropertyId] from Views; 
+1

[Sql Fiddle] (http://sqlfiddle.com/)에서 샘플을 만드시겠습니까? –

+0

결과가 표시됩니까? SELECT * FROM PropertyToViewMap WHERE ViewId = 11 – GilM

답변

0

는 :

inner join [PropertyToViewMap] p on [p].[ViewId] = [v].[Id] 

을 더 이상 받고 결과이다, 나는 이러한 조건에 부합하는 기록이없는 말을 같은 생각합니다. 이것을 LEFT JOIN으로 변환하고 null 값을 얻는 지 확인해 볼 수 있습니다 PropertyId

+0

해당 줄을 왼쪽 조인으로 변경하면이 오류가 발생합니다. 외부 조인은 재귀 공통 테이블 식의 재귀 부분에서 허용되지 않습니다 ' 조회수 '. –

+0

재귀 CTE에서 왼쪽 조인을 할 수없는 것 같습니다. 글쎄, 당신은 내 이론을 실제로 테스트 할 수는 없지만, 나는 아직도 그것을 견뎌야한다. 아무것도 반환되지 않고 추가 한 유일한 것이 INNER JOIN 인 경우 해당 기준과 일치하는 것이 없습니다. –

+0

아니요, 당신은 매우 정확합니다. 특정 재귀 중에는 결과가 없습니다. 그래도 쿼리가 작동해야 뷰가 계층 구조에 속한 뷰에 속하는 모든 PropertyId를 선택할 수 있습니다. 이것은 정말로 나를 곤란하게 만들었습니다. –

관련 문제