ORDER BY Within JOIN Ordering



2我正试图在基于联接的订单中执行一种os子排序。

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顺序,同时仍然尊重基于JOIN建立的AreaId顺序?

我尝试过使用:

ORDER BY
    s.AreaId, w.Score

JOIN导致基于@ScoresTable.AreaId顺序的正确排序,如:

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

我会在@ScoresTable中添加一个AreaOrder列,所以它有两列AreaOrder,AreaId,然后你就可以

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 

没有JOIN订单这样的东西。当没有ORDER BY子句时,您所遵守的顺序是任意的。这些数据可能是这样的,但一旦你在服务器上有一行或多行(或更少)或不同的负载,或者在任何连接的表上有不同的分布,或者月球离地球越来越近,查询计划可能会不同,结果集的顺序也会不一样。

关键是,如果不提供ORDER BY子句,则不能也不应该期望特定的排序。

从您显示的重复信息中,我们可以猜测订单是基于Id ASC


现在,从您显示的有限数据来看,您似乎希望将具有相同AreaId的行分组在一起,并按Score对它们进行排序。然而,AreaId的各种值之间的排序似乎很奇怪(5 -> 3 -> 6)。

如果你想让它受到Id列的影响,下面可能是你想要的:

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

(请注意,如果你用MAX(w.Id)替换MIN(w.id),你会得到与特定数据相同的结果。如果你的其他数据符合这一点,我们不能确定。)

我在AreaId中看到了降序,所以您希望在查询中重复这一点。当前查询中的"订单依据"始终位于任何子查询或视图中的"订购依据"之上。

ORDER BY
    s.AreaId desc, w.Score

最新更新