2012-01-11 92 views
1

我有一個由列ID(鍵),符號,方向,範圍,價格,百分比組成的表。我想刪除符號,方向,價格和百分比都相同,並且範圍最低的數據。我怎麼做到這一點?在Access中刪除SQL中的重複項

我一直試圖改變這種說法:DELETE FROM aw WHERE id not in (select min(id) from aw group by symbol, direction, price, percent);得到的東西工作。

+0

我不清楚你的第一段。這是否意味着您只想爲符號,方向,價格和百分比的每個組合保留一行...並且該行應該是該字段組合中具有最低範圍值的第一行? – HansUp 2012-01-11 17:06:25

+0

@HansUp這正是我想要的 – Mike 2012-01-11 17:11:39

回答

2

下面是AW表的樣本數據。根據您的描述,我想你想用的2 ID值,3丟棄行,和5

ID symbol direction range price percent 
1 a  x   15 10  5 
2 a  x   20 10  5 
3 b  y   40 50  5 
4 b  y   10 50  5 
5 a  x   15 10  5 

確定的symboldirectionprice每個組合的最小範圍值,並percent

qryMinRanges

SELECT 
    aw.symbol, 
    aw.direction, 
    aw.price, 
    aw.[percent], 
    Min(aw.range) AS MinOfrange 
FROM aw 
GROUP BY 
    aw.symbol, 
    aw.direction, 
    aw.price, 
    aw.[percent]; 

...這使得這個結果集:

symbol direction price percent MinOfrange 
a  x   10  5   15 
b  y   50  5   10 

確定爲每個最小範圍的最低ID

qryMinID_forMinRanges

SELECT 
    q.symbol, 
    q.direction, 
    q.price, 
    q.[percent], 
    q.MinOfrange, 
    Min(aw.ID) AS MinOfID 
FROM 
    qryMinRanges AS q 
    INNER JOIN aw 
    ON 
     (q.MinOfrange = aw.range) 
     AND (q.[percent] = aw.[percent]) 
     AND (q.price = aw.price) 
     AND (q.direction = aw.direction) 
     AND (q.symbol = aw.symbol) 
GROUP BY 
    q.symbol, 
    q.direction, 
    q.price, 
    q.[percent], 
    q.MinOfrange; 

...這使得這個結果集:

symbol direction price percent MinOfrange MinOfID 
a  x   10  5   15  1 
b  y   50  5   10  4 

所以qryMinID_forMinRanges應該代表你想保留的行。最終,您將刪除aw的行,其ID值未包含在qryMinID_forMinRanges中。但首先嚐試使用SELECT查詢來確認您的目標是正確的刪除記錄。

SELECT 
    aw.ID, 
    aw.symbol, 
    aw.direction, 
    aw.range, 
    aw.price, 
    aw.[percent] 
FROM aw 
WHERE aw.ID Not In 
    (SELECT MinOfID FROM qryMinID_forMinRanges); 

......這給了我這樣的結果集:

ID symbol direction range price percent 
2 a  x   20 10  5 
3 b  y   40 50  5 
5 a  x   15 10  5 

所以,如果看起來正確,將其更改爲刪除查詢。

DELETE * 
FROM aw 
WHERE 
    (((aw.ID) Not In 
     (SELECT MinOfID FROM qryMinID_forMinRanges))); 

的數據庫引擎不需要後刪除*。但是如果你想使用查詢設計器的預覽,你需要給它一個字段規範來顯示。

請注意保護您的數據,以防萬一我搞砸了任何細節。備份很好。 :-)

2

嘗試使用exists子句:

DELETE FROM aw 
WHERE 
    exists (
     select 
      1 
     from 
      (select symbol, direction, price, percent, min(range) as minrange from aw 
      group by symbol, direction, price, percent) aw2 
     where 
      aw2.symbol = aw.symbol 
      and aw2.direction = aw.direction 
      and aw2.price = aw.price 
      and aw2.percent = aw.percent 
      and aw2.minrange = aw.range 
    ) 
+0

,但我需要最小範圍,而不是最小編號 – Mike 2012-01-11 16:46:51

+0

@Mike - 對不起,誤解了你的問題。試試:) – Eric 2012-01-11 16:52:13

+0

我不會繼續前進並運行一個像這樣的DELETE查詢。誰知道如果它有一個bug,它可能會做什麼;它可能只是刪除一切。 – 2012-01-11 16:56:28