2011-01-20 44 views
2

我有以下聯表值函數:幫助與RANK()在標量函數 - SQL Server 2008的

SELECT Locations.LocationId, 
     dbo.Search_GetSuitability(@SearchPreferences, 
      Score.FieldA, Score.FieldB, Score.FieldC) AS OverallSuitabilityScore, 
     RANK() OVER (ORDER BY OverallSuitabilityScore) AS OverallSuitabilityRank 

FROM  dbo.LocationsView Locations 
INNER JOIN dbo.LocationScores Score ON Locations.LocationId = Score.LocationId 
WHERE  Locations.CityId = @LocationId 

RANK()線是給我的錯誤:

Invalid column name 'OverallSuitabilityScore'.

函數dbo.Search_GetSuitability是一個標量函數,它返回DECIMAL(8,5)。我需要根據該值爲每行分配一個等級。

我可以得到上述工作的唯一方法是再次在ORDER BY部分添加標量函數調用 - 這很愚蠢。我有大約5個這樣的標量函數調用,我需要爲每個值分別輸入RANK()

我該怎麼辦?我可以使用公用表表達式(CTE)嗎?

+0

如果沒有訂購方式,是不是隻是隨機選擇10個值? – Thomas 2011-01-20 22:29:11

+0

@Thomas - 調用存儲過程中有一個OrderBy。 – RPM1984 2011-01-20 22:31:30

+0

RANK函數會正確地賦值,因爲OVER(ORDER BY ...),結果集的順序沒有定義, – bobs 2011-01-20 22:31:49

回答

4

是的,你不能在SELECT子句中引用列別名。 CTE聽起來不錯。下面是一個例子

WITH Score as 
    (
    select Score.LocationId, Score.FieldA, Score.FieldB, Score.FieldC, 
     dbo.Search_GetSuitability(@SearchPreferences, 
      Score.FieldA, Score.FieldB, Score.FieldC) AS OverallSuitabilityScore 
    from dbo.LocationScores 
    ) 

SELECT TOP(10) 
     Locations.LocationId, 
     Score.OverallSuitabilityScore, 
     RANK() OVER (ORDER BY OverallSuitabilityScore) AS OverallSuitabilityRank 

FROM  dbo.LocationsView Locations 
INNER JOIN Score ON Locations.LocationId = Score.LocationId 
WHERE  Locations.CityId = @LocationId 
2

這樣做的老派方式只是爲了表達子查詢。 此處的CTE僅將子查詢移動到頂端

SELECT TOP(10) LocationId, 
     OverallSuitabilityScore, 
     RANK() OVER (ORDER BY OverallSuitabilityScore) AS OverallSuitabilityRank 
FROM 
(
    SELECT 
     Locations.LocationId, 
     dbo.Search_GetSuitability(@SearchPreferences, 
      Score.FieldA, Score.FieldB, Score.FieldC) AS OverallSuitabilityScore 
    FROM  dbo.LocationsView Locations 
    INNER JOIN dbo.LocationScores Score ON Locations.LocationId = Score.LocationId 
    WHERE  Locations.CityId = @LocationId 
) X