我有一个由列ID(键),符号,方向,范围,价格,百分比组成的表。我想删除符号,方向,价格和百分比都相同,并且范围最低的数据。我怎么做到这一点?在Access中删除SQL中的重复项
我一直试图改变这种说法:DELETE FROM aw WHERE id not in (select min(id) from aw group by symbol, direction, price, percent);
得到的东西工作。
我有一个由列ID(键),符号,方向,范围,价格,百分比组成的表。我想删除符号,方向,价格和百分比都相同,并且范围最低的数据。我怎么做到这一点?在Access中删除SQL中的重复项
我一直试图改变这种说法:DELETE FROM aw WHERE id not in (select min(id) from aw group by symbol, direction, price, percent);
得到的东西工作。
下面是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
确定的symbol
,direction
,price
每个组合的最小范围值,并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)));
的数据库引擎不需要后删除*
。但是如果你想使用查询设计器的预览,你需要给它一个字段规范来显示。
请注意保护您的数据,以防万一我搞砸了任何细节。备份很好。 :-)
尝试使用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
)
我不清楚你的第一段。这是否意味着您只想为符号,方向,价格和百分比的每个组合保留一行...并且该行应该是该字段组合中具有最低范围值的第一行? – HansUp 2012-01-11 17:06:25
@HansUp这正是我想要的 – Mike 2012-01-11 17:11:39