2012-07-26 2 views
2

파생 테이블 쿼리에 값을 전달하는 방법이 있습니까?파생 테이블에 값 전달

파생 테이블에서 외부 쿼리의 값 ([docSVsys].[sID])을 참조합니다.

Msg 4104, Level 16, State 1, Line 7 The multi-part identifier "docSVsys.sID" could not be bound.

예 내가이 쿼리가 더 루프를 단순화 할 수있어 :

는 오류가 발생합니다.
루프를 만들어서 변환하려고하는 커서를 가져야합니다.

select top 10 [docSVsys].[sID], [sI].[count] 
from docSVsys 
join 
(
    select count(*) as [count] 
    from docSVenum1 as [sIt] 
    where [sIt].[sID] = [docSVsys].[sID] 
) as [sI] 
on '1' = '1' 
order by [docSVsys].[sID] 

트릭을 적용한 것으로 보입니다. 그리고 정확히 커서 버전보다 1/3 빠릅니다. 아래의 교차 적용을 사용하는 실제 검색어.

SELECT [sO].[sID], [sI].[max], [sI].[avg], [sI].[stdev] 
FROM docSVsys as [sO] with (nolock) 
cross apply 
( 
    select [sO].[sID], max(list.match) as 'max', avg(list.match) as 'avg', stdev(list.match) as 'stdev' 
    from 
    (
     select #SampleSet.[sID], [match] = 200 * count(*)/CAST (#SampleSetSummary.[count] + [sO].[textUniqueWordCount] as numeric(8,0)) 
     from #SampleSet with (nolock) 
     join FTSindexWordOnce as [match] with (nolock) -- this is current @sID 
      on match.wordID = #SampleSet.wordID 
      and [match].[sID] = [sO].[sID] 
     join #SampleSetSummary with (nolock) -- to get the word count from the sample set 
      on #SampleSetSummary.[sID] = #SampleSet.[sID] 
     group by #SampleSet.[sID], #SampleSetSummary.[count] 
    ) as list 
    having max(list.match) > 60 
) as [sI] 
where [textUniqueWordCount] is not null and [textUniqueWordCount] > 4 and [sO].[sID] <= 10686 
order by [sO].[sID] 

답변

3

당신은 당신이 원하는 것을 할 수있는 CROSS으로 가입하기보다는 적용 :

select top 10 [docSVsys].[sID], [sI].[count] 
from docSVsys 
cross apply 
( 
    select count(*) as [count]  
    from docSVenum1 as [sIt] 
    where [sIt].[sID] = [docSVsys].[sID] 
) as [sI] 
order by [docSVsys].[sID] 
+0

이것은 루프처럼 보일 것입니다. 권리? –

+0

테스트 해 보겠습니다. 지금까지 그것은 좋아 보인다. – Paparazzi

+0

예, 반복적 인 방식으로 구현되었지만 요청 된 사항이었습니다. 쿼리에 의한 그룹 조인보다 성능이 좋은지 여부는 테이블, 인덱스 등의 크기에 따라 다릅니다. 또 다른 옵션은 sID에 대한 인덱스를 가질 수 있도록 임시 테이블로 쿼리 그룹을 실행하는 것입니다. 다양한 옵션을 테스트하고 가장 잘 수행하는 옵션을 사용한다고 말하고 싶습니다. – GilM

2

그에서 파생 된 테이블에 ID를 추가하고 조인

select top 10 [docSVsys].[sID], [sI].[count] 
from docSVsys 
join 
(
    select [sIt].[sID], count(*) as [count] 
    from docSVenum1 as [sIt] 
    group by [sIt].[sID] 
) as [sI] 
on [sI].[sID] = [docSVsys].[sID] 
order by [docSVsys].[sID] 
+0

예 그 대체 구문입니다. 하지만 한 번에 [docSVsys] [sID]를 하나씩 반복해야합니다. 실생활에서는 내부 루프가 모든 행을 한 번 생성하면 몇 TB가됩니다. 이 내부 루프는 한 번에 약 1 M 행을 평가하여 하나의 출력 행을 생성합니다. 그리고 내부 고리는 약 1 M 번 호출됩니다. 이것은 단지 커서로있을 수 있습니다. 커서로 8 시간 (적은 메모리 사용량으로) 실행됩니다. – Paparazzi