-2

2結合に基づいてオーダー内で kind os sub オーダーを実行しようとしています。

SELECT 
    w.* 
FROM 
    [dbo].[Scores] AS w
    JOIN @ScoresTable AS s on s.AreaId = w.AreaId
WHERE 
    [Id] = @Id
ORDER BY
    w.Score  -- this is where the problem is

ScoresTableは特定の順序を持​​つテーブル変数であるため、w から選択したデータは AreaId の順序に基づいています。

私がやろうとしているのは、これらの結果を列に基づいて並べ替えることですが、それは句w.Scoreから(正しく)取得した順序を「上書き」しているようです。JOIN

に基づいて確立されScoreた順序を尊重しながら、順序を追加するにはどうすればよいですか?AreaIdJOIN

私は使用してみました:

ORDER BY
    s.AreaId, w.Score

@ScoresTable.AreaIdJOIN は、次のような順序に基づいて正しい順序になります。

AreaId  
5
3
6

ORDER BY 句を使用しないと、次のようになります (AreaId は必要に応じて並べ替えられます)。

Id  Score   WheId   AreaId  ContextId
25  25      2       5       1
26  50      2       5       2
27  2       2       5       3
28  10      2       5       4
29  5       2       5       5
39  1       2       3       11
40  30      2       6       12

ここでやりたいことは、Score 列でこれを並べ替えて、この結果セットを取得することです (AreaId は必要に応じて並べ替えられ、Score で並べ替えられます)。

Id  Score   WheId   AreaId  ContextId
27  2       2       5       3
29  5       2       5       5
28  10      2       5       4
25  25      2       5       1
26  50      2       5       2
39  1       2       3       11
40  30      2       6       12
4

3 に答える 3

2

@ScoresTable に AreaOrder 列を追加すると、AreaOrder、AreaId の 2 つの列があり、次のことができます。

SELECT w.* 
FROM 
[dbo].[Scores] AS w
JOIN @ScoresTable AS s on s.AreaId = w.AreaId
WHERE [Id] = @Id
ORDER BY
s.AreaOrder, w.Score 
于 2013-08-14T23:12:16.907 に答える
2

JOIN秩序なんてものはありません。句がない場合に観察する順序ORDER BYは任意です。これらのデータではこれである可能性がありますが、1 つ以上 (またはそれ以下) の行があるか、サーバーに異なる負荷があるか、結合されたテーブルのいずれかで異なる分散があるか、月が地球に近づくと、クエリ プランが異なる可能性があります。結果セットの順序は同じではありません。

ORDER BY要点は、句を提供しない場合、特定の順序を期待することはできず、期待すべきではないということです。

そして、あなたが示した結果から、注文はに基づいていると推測するかもしれませんId ASC


あなたが示した限られたデータから、同じ行をAreaId一緒にグループ化し、 で並べ替えたいようですScore。ただし、さまざまな値の間の順序付けAreaIdは奇妙に思えます ( 5 -> 3 -> 6)。

列の影響を受けたい場合はId、次のことが必要になる場合があります。

ORDER BY
    MIN(w.Id) OVER (PARTITION BY w.AreaId),
    w.Score ;

(また、 を に置き換えると、特定のデータで同じ結果が得られることに注意してくださいMIN(w.id)MAX(w.Id)残りのデータがそれに準拠している場合、確実に知ることはできません。)

于 2013-08-14T23:26:20.360 に答える
0

AreaId に降順が表示されるので、クエリでそれを繰り返す必要があります。現在のクエリの Order By は、サブクエリまたはビューの Order By より常に優先されます。

ORDER BY
    s.AreaId desc, w.Score
于 2013-08-14T21:47:56.753 に答える