【问题标题】:Is there any thing such as SELECT LAST in sql query?sql查询中是否有诸如SELECT LAST之类的东西?
【发布时间】:2010-09-14 16:32:38
【问题描述】:

我正在使用sybase 数据库查询每日交易报告。我的脚本中有子查询。

现在是这样:

SELECT orders.accountid ,items.x,etc
(SELECT charges.mistotal FROM charges where items.id = charges.id)
FROM items,orders
WHERE date = '2008-10-02'

在这里我收到错误消息:

子查询不能返回多个值

我的值是 7.50、25.00

我想返回 25.00,但是当我使用时

(SELECT TOP 1 charges.mistotal FROM charges where items.id = charges.id)

我的结果是 7.50,但我想返回 25.00

有人有更好的建议吗?

【问题讨论】:

  • 为什么不发布完整的查询并解释如何选择“最后一个”charges.mistotal 值。根据查询的其余部分以及“最后一个”的含义,您可能可以用另一个联接和聚合函数替换子查询。我们需要细节! :)

标签: sql sybase


【解决方案1】:

您根据什么标准选择 25.00 而不是 7.5?

如果它与最大值有关,您可以尝试在该字段上使用 MAX() 函数。

如果它与按时间顺序添加的最后一行有关,请尝试在日期时间字段上使用 MAX(),如果您有关于添加的小时和分钟的详细信息。

【讨论】:

    【解决方案2】:

    你可以试试这个:

    SELECT MAX(charges.mistotal) FROM charges WHERE items.id = charges.id
    

    【讨论】:

      【解决方案3】:
      SELECT TOP 1 * 
      FROM dbo.YourTable 
      ORDER BY Col DESC
      

      在你的情况下,我猜是

      SELECT TOP 1 charges.mistotal 
      FROM charges where items.id = charges.id 
      ORDER BY charges.mistotal DESC
      

      【讨论】:

        【解决方案4】:

        SELECT TOP 1 charge.mistotal FROM charge where items.id = charge.id ORDER BY charge.id DESC

        order by 子句将确保它按 id 的顺序返回,而 DESC 表示降序,因此它会首先为您提供最大(最新)的值。 TOP 1 当然可以确保你得到那个。

        【讨论】:

          【解决方案5】:

          对子查询进行排序。如果您想要“最后一个”值,则需要定义如何确定最后一个项目(请记住,SQL 结果集默认情况下是无序的)。

          例如:

          (SELECT TOP 1 charges.mistotal FROM charges where items.id = charges.id 
           ORDER BY charges.mistotal DESC)
          

          这将返回 25.00 而不是 7.50(来自您上面的数据示例),但我假设您希望这个值是“最后一个”,因为它更大。可能还有一些其他领域对您来说更有意义;例如,也许您有一个时间戳列,您可以对其进行排序以获得最新值而不是最大值。关键是定义“最后一个”是什么意思。

          【讨论】:

          • 我不使用 Sybase(我更喜欢 MS SQL Server),但我很确定这是任何 rdbms 都应该实现的标准语法。我只能说检查你的语法。
          【解决方案6】:

          那么,你可以使用逆序吗:

          (SELECT TOP 1 charges.mistotal
              FROM charges
              WHERE items.id = charges.id
              ORDER BY charges.mistotal DESC
          )
          

          实际上,由于您没有给出明确的顺序,因此返回结果的顺序是不确定的,您很幸运它给了您不想要的答案;它本可以给你你想要的答案,然后你可能没有注意到它并不总是正确的,直到它投入生产。

          或者,你可以使用:

          (SELECT MAX(charges.mistotal)
              FROM charges
              WHERE charges.id = items.id
          )
          

          或者你真的想要一个 SUM?

          【讨论】:

            【解决方案7】:

            要获得第一,请使用 select top 1 | first * from table 升序排在最后,只需颠倒您的顺序即可。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-03-21
              • 1970-01-01
              • 2011-01-22
              • 2013-08-09
              • 1970-01-01
              • 2020-10-12
              • 1970-01-01
              • 2015-02-26
              相关资源
              最近更新 更多