我有一个表,该表由id(key),符号,方向,范围,价格,百分比列组成。我想删除符号,方向,价格和百分比相同且范围最小的数据。我将如何完成?
我一直在尝试改变这种说法:DELETE FROM aw WHERE id not in (select min(id) from aw group by symbol, direction, price, percent);使某些东西起作用。
DELETE FROM aw WHERE id not in (select min(id) from aw group by symbol, direction, price, percent);
这是 aw 表的样本数据。根据您的描述,我认为您想丢弃ID值分别为2、3和5的行。
ID
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。
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
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查询。
DELETE * FROM aw WHERE (((aw.ID) Not In (SELECT MinOfID FROM qryMinID_forMinRanges)));
数据库引擎不需要*after DELETE。但是,如果要使用查询设计器的预览,则需要为其指定要显示的字段规范。
*
如果我在这里弄错了任何细节,请采取预防措施以保护您的数据。备份很好。:-)