2009-05-20 80 views
8

我用下面的語句使用TOP 5訪問SQL返回超過5個結果?

SELECT TOP 5 rootcause, COUNT(IIF(accountability="Team 1",1,0)) 
FROM MOAQ 
WHERE CDT=1 
GROUP BY rootcause 

MOAQ是另一個查詢,從4桌,沒有什麼特別的返回約20場。這按預期工作,我得到5個結果。

如果我在條件字段上添加ORDER BY子句,儘管我開始獲得8個結果。如果我按照第一場排序,沒有問題。

任何人都知道可能會發生什麼?

編輯澄清 - 我只在此時從Access 2003內進行測試,最終語句將通過ADO從Excel前端進行參數化查詢。

+0

這是從內部訪問還是你從一個程序訪問訪問?如果是後者,你使用什麼連接字符串?你還使用什麼版本的Access? – AnonJr 2009-05-20 13:13:16

回答

28

這在Access中top指令的已知作用,但它不是很出名......

top指令不返回頂部n項目,作爲一個很容易導致相信。相反,它至少會返回由結果排序確定的不同項目。

在大多數情況下它是相同的,但在您的示例中,第5到第8項具有相同的排序值,所有這些都包括在內。它返回前五個項目,但也返回與第五個項目具有相同訂購價值的所有項目。

如果您未對錶應用任何排序,則會考慮所有字段,因此如果結果中有唯一字段,查詢將始終返回五個項目。當然,如果唯一字段包含在排序中。

SQL的其他方言可能會有不同的表現。例如,在T-SQL(SQL Server)中,單獨的top指令永遠不會返回多於n項目。但是,通過指定條款with tiesorder by以及top,可以觀察到與Access中相同的行爲。

+2

+1有趣!不知道的已知效果 – Andomar 2009-05-20 13:40:16

+0

非常有趣,謝謝 – Lunatik 2009-05-20 14:32:20

1

轉到Access 2003幫助名稱中的頁面About ANSI SQL query mode (MDB),然後展開'爲什麼使用ANSI-92 SQL?'主題,你會看到這一點:

「使用限制爲ンROWS子句限制查詢返回的行數」

所以只是把訪問用戶界面爲ANSI-92查詢模式或使用OLE數據庫(例如ADO)代碼,並添加子句

LIMIT TO 5 ROWS 

到您的查詢。

...

只是在開玩笑!這僅僅是Access數據庫引擎記錄不完整的另一個例子。我認爲Access文檔團隊中的某個人做出了一個不太合理的假設,即Access數據庫引擎的所謂ANSI-92查詢模式將符合ISO/ANSI SQL-92標準。不是這樣。 Access數據庫引擎具有自己專有的(即非SQL-92標準)語法TOP n(不要與SQL Server自己專有的TOP n語法在語義上不同)混淆。簡而言之,它不能解決重複問題。如果標準滿足表中的每一行,那麼你會得到結果集中表中的每一行。

解決方法是使用遊標只讀取結果集中的前n行。由於Access數據庫SQL不支持過程代碼或顯式遊標,因此您需要在「客戶端」一側執行此操作,例如打開一個Recordset對象,並將前n個記錄讀入一個僞造的ADO記錄集。