我有一个任务可以识别表中的负值,并在同一个表/列中找到匹配的正值,然后删除这两个条目。列中可能存在多个正值,在这种情况下,只应删除一个匹配的正值和负值。只有一个负值,但可能是多个匹配的正值。这种情况下的值是数字(交易数据)。
例如,表'Transactions'和'Value'列有: -10.02, 10.02, 10.02
我需要一个sql查询,它将删除负值和一个匹配的正值。
我尝试使用'select abs'将负数转换为正数,然后使用'count count'但它只返回2个正值。我可能走错了路,并且拥有非常基本的SQL技能。
所有帮助将不胜感激!
答案 0 :(得分:0)
您的问题描述不清楚是否可能对于给定的负值,不存在匹配的正值,以及在这种情况下该怎么做。
如果保证每个负值至少有一个正值,请使用此值(假设您有一个列'id'):
DELETE FROM transactions WHERE id IN (
SELECT tid FROM (
SELECT id AS tid FROM transactions WHERE value IN (
SELECT (value * ( -1 )) FROM transactions WHERE value <0
)
GROUP BY value
) AS tmp
);
DELETE FROM transactions WHERE value < 0;
GROUP BY保证只发生一个ID,但不保证某个顺序。
由于MySQL的限制,我们需要SELECT tid FROM ... AS tmp
部分来修改直接在SELECT部分中使用的表,这里有详细说明:
MySQL Error 1093 - Can't specify target table for update in FROM clause
如果您不使用MySQL,可以使用几种更优雅的变体,但上面的代码适用于大多数SQL产品。