6

我正在使用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

有没有人有更好的建议?

4

7 回答 7

11
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
于 2008-10-02T00:13:04.827 回答
2

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

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

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

于 2008-10-02T00:08:15.480 回答
1

你可以试试这个:

SELECT MAX(charges.mistotal) FROM charges WHERE items.id = charges.id
于 2008-10-02T00:09:10.080 回答
1

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

(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?

于 2008-10-02T00:19:12.147 回答
1

首先,您使用 select top 1 | 第一个 * 从表顺序升序到最后,只需颠倒您的顺序。

于 2008-10-02T01:00:47.163 回答
0

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

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

于 2008-10-02T00:13:36.183 回答
0

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

例如:

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

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

于 2008-10-02T00:14:48.897 回答