SQL查询,负值和正值匹配和删除

时间:2015-08-05 21:11:09

标签: tsql

我有一个任务可以识别表中的负值,并在同一个表/列中找到匹配的正值,然后删除这两个条目。列中可能存在多个正值,在这种情况下,只应删除一个匹配的正值和负值。只有一个负值,但可能是多个匹配的正值。这种情况下的值是数字(交易数据)。

例如,表'Transactions'和'Value'列有: -10.02, 10.02, 10.02

我需要一个sql查询,它将删除负值和一个匹配的正值。

我尝试使用'select abs'将负数转换为正数,然后使用'count count'但它只返回2个正值。我可能走错了路,并且拥有非常基本的SQL技能。

所有帮助将不胜感激!

1 个答案:

答案 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产品。