2009-09-25 27 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