2011-01-20 18 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 

を:

Invalid column name 'OverallSuitabilityScore'.

関数dbo.Search_GetSuitabilityスカラー関数で、DECIMAL(8,5)を返します。その値に基づいて各行にランクを割り当てる必要があります。

上記のように動作するようになる唯一の方法は、ORDER BY部分にスカラー関数呼び出しを再度追加することです。これは愚かです。私はこれらのスカラー関数呼び出しのうちの約5つを持っており、それぞれ別々のRANK()値が必要です。

私は何ができますか? Common Table Expression(CTE)を使用できますか?

+0

10人の値をランダムに選択しますか? – Thomas

+0

@Thomas - 呼び出し元のストアドプロシージャにOrderByがあります。 – RPM1984

+0

RANK関数は 'OVER(ORDER BY ...')のために値を適切に割り当てます。結果セットの順序は定義されていません – bobs

答えて

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 
+0

素晴らしい、ありがとう。私は本当にCTEのことを学び始める必要がある。なぜなら、私は開発者の生活の70%をSQL Server 2000に費やしてきたので、これらのすてきなサービスはすべて忘れてしまったからです。 .. – RPM1984

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 
+0

うん、もう一つの選択肢です。 +1 – RPM1984