下面的SQL返回任何带有最小编号的记录,它应该可以正常工作:
SELECT Id, Number
FROM TableA
WHERE Number = (select Min(Number) from TableA)
有没有办法可以编写SQL 而不用子Select语句,但是仍然会返回相同的结果?
答案 0 :(得分:1)
with table_ranked(d, numb, rk) as (
select
id,
number,
row_number() over (order by number asc) as rk
from TableA
)
select
d,
numb
from table_ranked
where rk = 1
如果您可以访问实现with
子句的数据库,并且像{oracle 10g环境那样row_number
,则可能是一个想法。
你显然也可以做到以下几点:
select
id,
number
from (select
id,
number,
row_number() over (order by number asc) as rk
from TableA
) table_ranked
where rk = 1
这些都没有真正回答你原来的问题,但可以被视为替代策略。
答案 1 :(得分:1)
对于min(数字),OP的查询将返回多行(Number)到目前为止给出的一些答案只会返回一行。
要使用TOP和ORDER BY,需要包含WITH TIES:
select top 1 with ties id, number
from TableA
order by Number
如果使用带窗口函数的CTE或内联视图,则需要使用RANK()而不是ROW_NUMBER():
; with CTE (R, ID, Number) as
(select rank() over (order by Number)
, ID, Number
from TableA)
select ID, Number
from CTE
where R = 1
此外,请在使用上述方法之一替换您的查询之前进行基准测试。对于我曾经测试的一个非常小的表,OP中的查询的成本不到TOP WITH TIES或本答案中列出的RANK()版本的一半。
答案 2 :(得分:0)
这适用于MySQL 5.1:
SELECT Id,Number FROM TableA HAVING Number=MIN(Number);
附录
@rexem指出原始答案可能不适用于SQL Server。
我已经开始使用其他方法了,但它非常hackish。理论上,如果您按数字排序,那么第一行应该是您的最小值,并将结果限制为一行:
SELECT Id,Number FROM Table A ORDER BY Number LIMIT 1
正如我所说,似乎很草率,但为我完成了工作。我很抱歉无法在SQL Server而不是MySQL上测试这些。
答案 3 :(得分:0)
在MSSQL中你可以做到
select top 1 ID, Number from TableA order by Number
(类似于布伦特纳什的答案)
答案 4 :(得分:0)
测试我做了有原因:
SELECT Id, Number
FROM TableA
Group by Id, Number
Having Number = Min(Number)
结果:
ID Number
1 1
4 1
5 2
6 2
2 3
3 3
7 6
所以它不起作用。
是的,我同意这个“选择前1个ID,数字来自TableA的数字顺序”,但如果它是一个复杂的查询,它就会变得很难看。
看起来我对我现在的原始查询感到满意
答案 5 :(得分:0)
SELECT a.Id, a.Number FROM TableA a
inner join (select Min(Number) from TableA) m
on a.Number = m.Number
答案 6 :(得分:-1)
不,没有子查询就无法做到这一点。