【问题标题】:SQL error on ORDER BY in subquery (TOP is used)子查询中 ORDER BY 的 SQL 错误(使用了 TOP)
【发布时间】:2016-04-29 11:30:46
【问题描述】:

我从以下查询中得到Syntax error near 'ORDER'

SELECT i.ItemID, i.Description, v.VendorItemID
FROM Items i 
JOIN ItemVendors v ON
    v.RecordID = (
                 SELECT TOP 1 RecordID
                 FROM ItemVendors iv
                 WHERE
                     iv.VendorID = i.VendorID AND
                     iv.ParentRecordID = i.RecordID
                 ORDER BY RecordID DESC
                 );

如果我删除ORDER BY 子句,查询运行良好,但不幸的是,必须从降序列表中提取而不是升序。我找到的所有与此相关的答案都表明必须使用TOP,但在这种情况下,我已经在使用它了。当TOPORDER BY 不是子查询的一部分时,我没有任何问题。有什么想法吗?

【问题讨论】:

  • 如果你使用max()而不是top会发生什么?
  • 使用max() 会导致同样的错误,但这是意料之中的,因为在子查询中使用order by 需要使用top
  • 你可能是想让我不要在你的建议中使用order by,但我误解了。你是对的,谢谢!

标签: sql sybase-asa


【解决方案1】:

此错误与 TOP 无关。 ASE 根本不允许在子查询中使用 ORDER BY。这就是错误的原因。

【讨论】:

    【解决方案2】:

    我会使用 max 而不是 top 1 ... order by

    选择 i.ItemID、i.Description、v.VendorItemID 从项目 i 加入 ItemVendors v ON v.RecordID = ( 选择最大值(记录 ID) 来自 ItemVendors iv 在哪里 iv.VendorID = i.VendorID 和 iv.ParentRecordID = i.RecordID);

    【讨论】:

    • 谢谢!虽然这并不能解释为什么我会遇到错误,但它确实解决了我的问题!
    【解决方案3】:

    ORDER BY 中的RecordID 不明确。在其前面添加适当的表别名(例如,iv.RecordID)。

    【讨论】:

    • 如果select子句中没有歧义,为什么order by子句中有一个? Order by 子句是指选择列表。我没有sybase,你有能力查一下吗?
    • @HamletHakobyan 好眼光!我错过了。这两个位置很可能是模棱两可的。
    • 我不知道它对 sybase 是如何工作的,但是对于 sql server,在这种情况下没有歧义。在相关查询引擎中,如果没有明确指定,则引用子查询表(如果它是一个表)。
    • 不幸的是,歧义不是问题:使用 iv.RecordID 也不起作用,只要删除 order by,简单地使用 RecordID 就可以用于 select 语句。
    猜你喜欢
    • 2010-11-02
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2020-06-23
    相关资源
    最近更新 更多