2009-09-25 58 views
3

的SQL下面返回任何记录以分钟数,它应该很好地工作:简化SQL敏声明

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

有没有办法,我可以写一个SQL 没有子Select语句,但仍返回相同结果?

+0

THX纠正我的问题rexem! – junk 2009-09-25 04:31:02

回答

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上测试它们。

+0

但这是SQL Server。 MySQL对GROUP BY语句有一个宽松的政策,大多数人不这样做。 – 2009-09-25 02:21:53

+0

我担心可能是这种情况(因此我列出了我的数据库)。我会再给它一次。感谢您的反馈。 – 2009-09-25 02:23:42

+0

你得到的东西接近我的预期,但必须测试它 – junk 2009-09-25 04:35:43

-1

不,你不能这样做,没有子查询。

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条款和row_number像一个Oracle 10g环境的数据库。

你能显然也做到以下几点:

select 
    id, 
    number 
from (select 
     id, 
     number, 
     row_number() over (order by number asc) as rk 
     from TableA 
     ) table_ranked 
where rk = 1 

这些真的都不回答你原来的问题,但可以被视为替代战略。

+0

我没有看到你在SQL服务器上,我认为它也有一个with子句。 – 2009-09-25 02:41:34

+0

@Simon,WITH是在SQL Server 2005中引入的。 – 2009-09-25 04:02:15

+0

此外,SQL Server的ROW_NUMBER()函数需要OVER(ORDER BY ) – 2009-09-25 04:04:51

0

在MSSQL中,你可以做

select top 1 ID, Number from TableA order by Number 

(类似于上面布伦特纳什的回答)

+0

我本可以做一些类似于你的,所以我想我想看看是否有办法我可以使用Min() – junk 2009-09-25 04:35:04

+0

尝试HAVING子句然后... – nicolaskruchten 2009-09-25 14:06:40

1

的OP的查询将在关系对分(数)的情况下返回多行的一些问题的答案给出到目前为止只会返回一行。

要使用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()版本的一半。

+0

实际上,我没有说我只想要一个记录返回。我明白有机会我会得到多个结果。另外,我正在整理存储产品中的查询,所以你到那里可能不适用 – junk 2009-09-25 04:34:12

+0

@Junk:我的答案会给你所有匹配min(number)的记录。对于其他答案并非如此。 – 2009-09-25 05:32:31

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 

所以这是行不通的。

是的,我同意这个“select 1 ID,Number from TableA order by Number”起作用,但如果它是一个复杂的查询,它会变得很难看。

它看起来像我很高兴与什么原始查询我对现在

0
SELECT a.Id, a.Number FROM TableA a 
inner join (select Min(Number) from TableA) m 
on a.Number = m.Number