【问题标题】:SQL query, negative and positive values matching and deletionSQL查询,正负值匹配删除
【发布时间】:2015-08-06 05:43:52
【问题描述】:

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

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

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

我尝试使用“选择 abs”将负数转换为正数,然后“计数”,但它只返回 2 个正值。我很可能走错了路,并且掌握了非常基本的 SQL 技能。

所有帮助将不胜感激!

【问题讨论】:

    标签: tsql


    【解决方案1】:

    您的问题描述不清楚对于给定的负值是否可能不存在匹配的正值,以及在这种情况下该怎么做。

    如果保证每个负值至少有一个正值,请继续使用(假设您有一个“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 产品。

    【讨论】:

    • 感谢您的快速回复。我更正了自己,并将在我的查询中更加具体。所有条目(负数和正数)都在一个表的一列中。如果没有与负数匹配的正值,则忽略负数条目,因为下游系统将拒绝处理负数(我可以接受)。我正在使用 SQL Server 2008 R2。我不确定'column id',指定的示例,如表名:事务'和列标题:'value'是否成立。
    猜你喜欢
    • 2021-12-05
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多