【问题标题】:How to fix incorrect syntax near keyword 'ORDER'如何修复关键字“ORDER”附近的错误语法
【发布时间】:2012-08-02 17:27:30
【问题描述】:

我有以下 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。

【问题讨论】:

  • 当您执行查询中显示的UNION 时,ORDER BY 子句适用于查询的两个部分,从而导致错误。
  • 对您要完成的工作感到好奇 - 将查询中的 COUNT 行作为 ID 返回,然后是实际行?
  • @n8wrl:第一行将返回联合结果中的总行数。

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


【解决方案1】:

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

如果您希望对整体结果进行排序,您可以添加 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 的值大于零。如果不是,您需要在联合的第一部分使用不同的(较低的)值。

【讨论】:

  • 谢谢!这就是我一直在寻找的。现在我想为第二个查询添加分页。请看:stackoverflow.com/questions/11783023/…
  • 为什么说它没有意义?我举个例子:我需要按日期排序的第一行和按日期排序的最后一行。为此,我有两个子选择,两个得到按日期 asc 排序的前 1 个和按日期 desc 排序的前 1 个。但它不会让我使用联合。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多