2014-01-07 89 views
0

我創建Web應用程序我的SQL語句時,有小問題只有個最小記錄。如何顯示從SQL數據庫

我有與to_do_list(ID,持續時間文本)的表,我想只顯示一個最小記錄(其中持續時間=最小值),即使有不止一個。

我創造了水木清華這樣的:

Select * from to_do_list where duration = (select min(duration) from to_do_list); 

但它顯示一個以上的記錄(我有相同的時間很少entrys)。

我也試過這一個:

Select id, min(duration), text from to_do_list; 

但在執行此查詢後,我收到了一個錯誤:

,因爲它不是在包含

「列to_do_list.id'在選擇列表中無效。聚合函數或GROUP BY子句

我發現,限制應解決我的問題,但在運行此之後,我發現了一個錯誤:

Select * from to_do_list where duration = (select min(duration) from to_do_list) LIMIT 1; 

「附近有語法錯誤 '限制'。」

我使用的是Microsoft SQL Express服務器2012

我將是距離U PPL任何幫助,不勝感激!

在此先感謝。

+0

錯誤是自我解釋你缺少一個'組by'。如果沒有別的東西分組,你不能聚合。你可能不想要'TOP 1',因爲這個值只是隨機的。你需要澄清你正在尋找的結果。 – Zane

回答

1

LIMIT在SQL Server中無法正常工作,使用TOP代替:

SELECT TOP 1 * 
FROM to_do_list 
WHERE duration = (SELECT MIN(duration) 
        FROM to_do_list); 

您也可以使用這個ROW_NUMBER()功能:

;WITH cte AS (SELECT *, ROW_NUMBER() OVER(ORDER BY duration) RN 
       FROM to_do_list) 
SELECT * 
FROM cte 
WHERE RN = 1 
+0

這隻有在OP不關心他得到哪個任務時纔有效。 – Zane

1

在我看來,這樣的:

select top 1 * 
from to_do_list t 
order by t.duration 

優選

select top 1 * 
from to_do_list t 
where t.duration = select min(duration) from to_do_list) 

雖然它是值得的檢查執行計劃,看看哪個效果更好。

+0

這隻有在OP不關心他得到哪個任務時纔有效。 – Zane

+0

是的,它應該是't.duration,other_expression'的順序來一致地解決關係。 –

+0

@Zane:你可能想讀* *原始問題陳述:「我有一張桌子,我想只顯示一個最小記錄(其中持續時間=最小值),即使有不止一個。 「雖然O.P. *可能會關心選擇持有最小持續時間的特定行,但他只說他想** **一行。 –