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]
War es hilfreich?

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top