2013-01-09 27 views
1

我試圖修剪一個Access表(contam),其中包含重複值和連接值。訪問權限刪除除最大值以外的所有信息

的表看起來像這樣

FederalSiteIdentifier Contam 
001 1 
001 1, 2 
001 1, 2, 3 
001 1, 2, 3, 4 
002 1 
003 1 
003 1, 2 
003 1, 2, 3 

我只想保留最後 - 最長的 - 進入每個ID,但無法找出正確的方式訪問SQL做到這一點。

做一些閱讀後,我想這簡單的代碼:

SELECT FederalSiteIdentifier, Max(Contam) as MaxCont 
FROM contam 
ORDER BY FederalSiteIdentifier 

產生一個錯誤。

任何人都可以幫忙嗎?

+0

你會得到哪個錯誤? – imreal

+1

我懷疑它會是一個沒有分組的錯誤... – twoleggedhorse

+1

你肯定會在某個階段壓扁這個文件嗎?如果是這樣,在展開文件後刪除會更容易,更安全。 – Fionnuala

回答

0

我認爲你需要每個FederalSiteIdentifierContam值的最大長度。你將需要一個GROUP BY條款。

SELECT FederalSiteIdentifier, Max(Len(Contam)) as MaxCont 
FROM contam 
GROUP BY FederalSiteIdentifier 

如果查詢標識要保留的行,它保存爲qryRows2Keep,那就試試這個DELETE查詢:

DELECT FROM contam 
WHERE 
    Len(Contam) < DLookup(
      "MaxCont", 
      "qryRows2Keep", 
      "FederalSiteIdentifier = '" & FederalSiteIdentifier & "'") 

我認爲FederalSiteIdentifier是文本數據類型。如果是數字,則丟棄DLookup表達式中的單引號。

請確保在嘗試這個未經測試的建議之前備份了您的數據。 :-)

+0

我重寫了代碼的最高位,它完成了這個技巧,我不需要刪除只是將其過濾到可以將它加載到電子表格中的位置。謝謝一堆! – Will

0

MAX是一個集合函數,如果您使用GROUP BY語句,則只能執行這些操作。 Access可以刪除記錄的方式也非常奇特。您不能離開加入和刪除,因此您必須識別不需要的記錄,然後刪除它們。

創建一個新列,以便我們可以選擇要保留的記錄。

ALTER TABLE contam ADD Keep BIT NOT NULL DEFAULT 0; 

現在請確定記錄和更新表

UPDATE c 
SET keep = 1 
FROM contam AS c 
     INNER JOIN (
        SELECT FederalSiteIdentifier, Max(Len(Contam)) as MaxCont 
        FROM contam 
        GROUP BY FederalSiteIdentifier 
        ORDER BY FederalSiteIdentifier 
       ) AS maxc 
     ON c.FederalSiteIdentifier = maxc.FederalSiteIdentifier 
     AND Len(c.Contam) = maxc.MaxCont; 

注意GROUP BY線......這是你錯過了什麼這是給你一個錯誤..

最後執行刪除

DELETE FROM contam 
WHERE keep = 0; 

現在可以刪除多餘的列

ALTER TABLE contam DROP COLUMN Keep; 

囉嗦,但你走了。

+0

我改變了我的答案,這將正常工作。昨晚沒有足夠的咖啡。 – twoleggedhorse

相關問題