简化的SQL Min语句

时间:2009-09-25 01:44:01

标签: sql sql-server tsql

下面的SQL返回任何带有最小编号的记录,它应该可以正常工作:

SELECT Id, Number 
  FROM TableA
 WHERE Number = (select Min(Number) from TableA)

有没有办法可以编写SQL 而不用子Select语句,但是仍然会返回相同的结果?

7 个答案:

答案 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)

不,没有子查询就无法做到这一点。