파생 테이블에 값 전달
-
12-12-2019 - |
문제
파생 테이블 쿼리에 값을 전달하는 방법이 있습니까?
파생 테이블에서 값을 참조하고 싶습니다. ([docSVsys].[sID])
외부 쿼리에서.
오류가 발생합니다.
MSG 4104, Level 16, State 1, Line 7 다중 파트 식별자 "Docsvsys.sid"는 바인딩 할 수 없습니다.
예, 이 쿼리를 루프 없이 단순화할 수 있다는 것을 알고 있습니다.
반복해야 하는 커서를 설정하고 이를 변환하려고 시도합니다.
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]
해결책
JOIN 대신 CROSS APPLY를 사용하여 원하는 작업을 수행할 수 있습니다.
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]
다른 팁
파생 테이블에 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]
제휴하지 않습니다 StackOverflow