2009-11-09 60 views
2

我在this問題中概述了基本相同的問題,但是我將Microsoft Access用作數據庫而不是MySQL。其結果是SQL_CALC_FOUND_ROWS似乎沒有提供給我。相信我,我想切換,但目前這是不可能的。通過使用Microsoft Access的查詢獲取組中的行數

我有一個查詢聚合的行數,本質上尋找基於某些鍵的重複行,使用一組。它看起來像這樣:

Select key1, key2, key3, Count(id) 
from table 
group by key1, key2, key3 
having Count(id) > 1 

我需要確定查詢將返回的行數(或分組)。

數據庫正在通過Java進行訪問,所以理論上我可以簡單地運行查詢,並循環遍歷它兩次,但我希望更快,最好是基於SQL的。有任何想法嗎?

回答

3

MS Access的記錄數應該會給你你需要的,還是我錯過了什麼?

如果需要從鍵不同的值,試試這個

SELECT COUNT(*) AS Expr2 
    FROM (
     SELECT DISTINCT [key1] & "-" & [key2] & "-" & [key3] AS Expr1 
      FROM Table1 
     ) AS SUB; 
+0

*數據庫正在通過Java *進行訪問,但我猜Java具有相當於RecordCount – Andomar 2009-11-09 19:22:55

+0

您能否詳細說明一下?我如何查看記錄數?請注意,我通過Java訪問這個,而不是訪問前端... – 2009-11-09 19:23:11

+0

@Andomar不,它沒有。無法從Java ResultSet對象中獲取記錄計數。 – 2009-11-09 19:29:19

0

當您創建Statement對象,你可以聲明它是滾動的。然後,您要做的第一件事就是滾動到結尾並獲取記錄編號。在查看最後一條記錄時,這將是結果集中記錄的數量。然後回滾到開始並正常處理。喜歡的東西:

Statement st=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
ResultSet rs=st.executeQuery(myQueryString); 
boolean any=rs.last(); 
int count = any ? count=getRow() : 0; 
... do whatever with the record count ... 
rs.first(); 
while (rs.next()) 
{ 
... whatever processing you want to do ... 
} 
rs.close(); 
... etc ... 

我不知道用的MS Access這樣做對性能的影響將是什麼,是否可以直接跳轉到結果集的結尾,或者如果它必須順序讀取所有記錄。不過,它應該比執行查詢兩次更快。

+0

我在多個地方找到了這個答案,但是從getRow返回的值是錯誤的(在成千上萬的時候它應該是數百)。而由於某種未知的原因 - 可能存在一些訪問問題 - 滾動似乎搞砸了光標。 – 2009-11-10 14:00:30

+0

嗯。我在MySQL和Oracle上多次使用過getRow,它一直運行良好。我想這可能是MS Access或JDBC驅動程序中存在錯誤。我的第一個想法是做最後一個/ getRow並檢查計數,讀取該記錄中的某個標識字段並將其轉儲出來,然後先執行,然後循環執行記錄計數。如果last/getRow真的說1000,但循環只發現100或其他任何東西,如哇,這是奇怪的。在我總結出這個明顯的錯誤之前,我會進行一些測試以確保它的確信。 – Jay 2009-11-10 17:35:45