我需要根据最高金额来获取ID。下面给我一个错误
select ID from Prog
where Amount = MAX(Amount)
聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。
最终结果是我需要获得正确的ID,因为我需要将其传递给期待它的其他东西。
答案 0 :(得分:3)
您需要按金额订购,然后选择1条记录......
SELECT ID
FROM Prog
ORDER BY Amount DESC
LIMIT 1;
这会占用Prog
中的所有行,按Amount
降序排序(换句话说,第一个排序的行具有最高Amount
),然后将查询限制为只选择一行(Amount
最高的一行)。
此外,子查询对性能不利。此代码作为子查询版本在一半的时间内在具有200k记录的表上运行。
答案 1 :(得分:2)
如果您正在使用应该执行此操作的SQL Server:
SELECT TOP 1 ID
FROM Prog
ORDER BY Amount DESC
答案 2 :(得分:2)
只需将带有max值的子查询传递给where子句:
select ID from Prog
where Amount = (SELECT MAX(Amount) from Prog)
答案 3 :(得分:1)
这应该是这样的:
select P.ID from Prog P
where P.Amount = (select max(Amount) from Prog)
编辑:
如果你真的只想要一行,你应该这样做:
select max(P.ID) from Prog P
where P.Amount = (select max(Amount) from Prog);
但是,如果你有多行可以匹配金额,而你只想要一行,那么你应该在选择一行的方式背后有一些逻辑。不仅仅依赖于这个最大技巧,或limit 1
类型逻辑。
另外,我不写limit 1
,因为这不是ANSI sql - 它在mysql中工作但是OP没有说出他想要的东西。每个数据库都不同 - 请参阅此处:Is there an ANSI SQL alternative to the MYSQL LIMIT keyword?不要习惯一个数据库的扩展,除非你只想在你的余生中工作1分贝。
答案 4 :(得分:-1)
select min(ID) from Prog
where Amount in
(
select max(amount)
from prog
)
min语句确保您只获得一个结果。