如何修复关键字'ORDER'附近的错误语法

时间:2012-08-02 17:27:31

标签: sql sql-server sql-order-by

我有以下SQL,当我尝试执行它时它会给我Incorrect syntax near keyword 'ORDER'

SELECT COUNT(*) AS ID 
FROM Employees i
  INNER JOIN #WeightedIDs w
  ON (i.ID = w.ID)
WHERE (i.DepartmentID = 10 and i.ShiftID = 2)

UNION ALL

SELECT i.ID FROM Employees i
  INNER JOIN #WeightedIDs w
  ON (i.ID = w.ID)
WHERE (i.DepartmentID = 10 and i.ShiftID = 2)
ORDER BY w.[Weight] ASC

我该如何解决?

更新

这就是我实际想要完成的事情。我有一个SPROC,它根据一系列不同的条件动态生成查询。它还构建了一个临时表,其中包含与这些id相关的ID和权重,因此我希望结果按此排序。一旦生成了查询,我想得到计数以及列表中返回的id。

2 个答案:

答案 0 :(得分:5)

在联合中,你只能订购完整的结果,而不是部分的结果,因为订购子选择没有意义 - 它是一个关系/表,它们(根据定义)没有排序。

如果您想要订购整个结果,可以添加ORDER BY 1 ASC以按第一列(也是唯一一列)排序。如果您希望第一部分中的所有行都在第二部分之前,并按重量对第二部分进行排序,则可以执行以下操作:

select id
from
(
  SELECT COUNT(*) AS ID, 
         0 as sort_column
  FROM Employees i
    INNER JOIN #WeightedIDs w
    ON (i.ID = w.ID)
  WHERE (i.DepartmentID = 10 and i.ShiftID = 2)

  UNION ALL

  SELECT i.ID, 
         x.[Weight] 
  FROM Employees i
    INNER JOIN #WeightedIDs w
    ON (i.ID = w.ID)
  WHERE (i.DepartmentID = 10 and i.ShiftID = 2)
) x
order by sort_column

这假设x.weight的值大于零。如果不是,则需要在联合的第一部分使用不同的(较低)值。

答案 1 :(得分:1)

如果将ORDER BY移动到UNION中的第一个SELECT,它将命令整个结果集。但它必须在第一个SELECT上,并且其他任何地方都会导致您看到的错误。