-2

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 按要求排序并按 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 然后你可以

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子句时观察到的顺序是任意的。这些数据可能是这样,但是一旦您在服务器上有一个或多个(或更少)行或不同的负载或任何连接表上的不同分布或月球离地球更近,查询计划可能会有所不同并且结果集的顺序将不一样。

关键是,如果您不提供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 回答