2008-10-02 69 views
6

我正在使用sybase数据库来查询日常事务报告。我在我的脚本中有子查询。有没有什么比如SELECT LAST在sql查询中?

这里,因为它有云:

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

有没有人有任何更好的建议?

+0

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

回答

2

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

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

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

1

你可以试试这个:

SELECT MAX(charges.mistotal) FROM charges WHERE items.id = charges.id 
9
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 
+0

我想他想要输入的最后一个订单,而不是输入的最大订单... – CodeRedick 2008-10-02 02:36:49

0

SELECT TOP 1 charges.mistotal从那里items.id =罪名指控。编号 ORDER BY charges.id DESC

order by子句将确保它按照ID和DESC意味着降序,因此它会首先给你最大(最新)的值。 TOP 1当然确保你得到那一个。

0

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

例如:

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

这将返回25.00,而不是7.50(从上面数据的例子),但我假设你希望这个值是“最后一次”,因为它是更大的。可能有一些其他领域对你来说更有意义,例如,你可能有一个时间戳列,你可以对它进行排序以获得最新的值而不是最大的值。关键在于定义“last”的含义。

+0

当我在我的子查询中包含ORDER BY时,它给了我ORDER附近的语法错误...... – jbcedge 2008-10-02 00:18:59

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?

1

要得到第一个使用select top 1 |首先*从表顺序升序得到最后,只是颠倒你的订单。