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
订单,同时仍然尊重基于AreaId
建立的JOIN
订单?
我尝试过使用:
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按要求排序并按分数排序):
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
答案 0 :(得分:2)
我会在你的@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
答案 1 :(得分:2)
没有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 ;
(请注意,如果您将MIN(w.id)
替换为MAX(w.Id)
,您将获得与特定数据相同的结果。如果您的其他数据符合此类,我们无法知道当然。)
答案 2 :(得分:0)
我在AreaId中看到降序,所以你想在查询中重复这个。当前查询中的Order By始终在任何子查询或视图中超过Order By。
ORDER BY
s.AreaId desc, w.Score