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