Transmettre la valeur à la table dérivée
-
12-12-2019 - |
Question
Existe-t-il un moyen de transmettre une valeur à une requête de table dérivée ?
Dans la table dérivée, je veux référencer une valeur ([docSVsys].[sID])
à partir de la requête externe.
J'obtiens une erreur :
MSG 4104, niveau 16, état 1, ligne 7 L'identifiant en plusieurs parties "docsvsys.sid" n'a pas pu être lié.
Oui, je sais que cette requête peut être simplifiée sans boucle.
Avoir un curseur qui doit boucler et essayer de le convertir ainsi défini.
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]
L'application croisée semblait faire l'affaire.Et c'est exactement 1/3 plus rapide que la version curseur.Requête réelle utilisant l'application croisée ci-dessous.
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]
La solution
Vous pouvez faire ce que vous voulez avec un CROSS APPLY plutôt qu'un JOIN :
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]
Autres conseils
Ajoutez l'ID à la table dérivée et rejoignez-la :
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]