在JOIN订购中订购

时间:2013-08-14 21:17:23

标签: sql sql-server tsql sql-server-2012

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

3 个答案:

答案 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