2012-01-11 94 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