Übergeben Sie den Wert an die abgeleitete Tabelle
-
12-12-2019 - |
Frage
Gibt es eine Möglichkeit, einen Wert an eine abgeleitete Tabellenabfrage zu übergeben?
In der abgeleiteten Tabelle möchte ich auf einen Wert verweisen ([docSVsys].[sID])
aus der äußeren Abfrage.
Ich erhalte eine Fehlermeldung:
MSG 4104, Stufe 16, Zustand 1, Zeile 7 Die mehrteilige Kennung "docsvsys.sid" konnte nicht gebunden werden.
Ja, ich weiß, dass diese Abfrage so vereinfacht werden kann, dass keine Schleife entsteht.
Habe einen Cursor, der eine Schleife ausführen muss, und versuche, ihn so zu konvertieren.
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]
Cross Apply schien den Zweck zu erfüllen.Und es ist genau 1/3 schneller als die Cursor-Version.Echte Abfrage mit Cross-Apply unten.
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]
Lösung
Sie können mit einem CROSS APPLY anstelle eines JOIN tun, was Sie wollen:
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]
Andere Tipps
Fügen Sie die ID zur abgeleiteten Tabelle hinzu und verknüpfen Sie diese:
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]