2014-07-25 102 views
2

編輯了一排的第一個實例:獲取使用的MS Access

我有這個疑問,其中我想選擇從表petTable記錄的第一個實例。

SELECT id, 
    pet_ID, 
    FIRST(petName), 
    First(Description) 
FROM petTable 
GROUP BY pet_ID; 

問題是我有大量的記錄,這個查詢太慢了。我發現GROUP BY減慢了查詢速度。你有什麼想法可以使這個查詢更快?或更好的查詢,其中我不需要使用GROUP BY

+0

您的表沒有主鍵嗎?如果pet_ID是主鍵,則不需要使用First,因爲對於同一個寵物不應該有多於1條記錄。 – PaulFrancis

+0

@paulFrancis,我剛剛更新了我的文章。假設我有id作爲主鍵並且pet_id可能在表中出現多次 – slek

+0

使用DISTINCT還會使查詢速度太慢 – slek

回答

0

你的查詢可以作爲改變,

SELECT ID, pet_ID, petName, Description 
FROM petTable 
WHERE ID IN 
(SELECT Min(ID) As MinID FROM petTable GROUP BY pet_ID); 

或者使用TOP子句,

SELECT petTable.petID, petTable.petName, petTable.[description] 
FROM petTable 
WHERE petTable.ID IN 
    (SELECT TOP 1 ID        
    FROM petTable AS tmpTbl        
    WHERE tmpTbl.petID = petTable.petID   
    ORDER BY tmpTbl.petID DESC) 
ORDER BY petTable.petID, petTable.petName, petTable.[description]; 
1

「問題是我的記錄數量龐大且此查詢是太慢了。我發現GROUP BY減慢查詢速度,你有什麼想法可以使查詢更快嗎?「

而就pet_ID索引,然後創建並測試該查詢:

SELECT pet_ID, Min(id) AS MinOfid 
FROM petTable 
GROUP BY pet_ID; 

一旦你的查詢工作,你可以加入它回到原始表---那將只選擇基於id匹配的原始行,並且您可以從這些匹配行中檢索所需的其他字段。

SELECT pt.id, pt.pet_ID, pt.petName, pt.Description 
FROM 
    petTable AS pt 
    INNER JOIN 
    ( 
     SELECT pet_ID, Min(id) AS MinOfid 
     FROM petTable 
     GROUP BY pet_ID 
    ) AS sub 
    ON pt.id = sub.MinOfid;