【问题标题】:SQL Query to remove related records in tableSQL查询删除表中的相关记录
【发布时间】:2017-05-26 23:43:16
【问题描述】:

我有一个简单的表格,其中包含名称、价格、状态等基本销售信息。 对于每个客户交互,它们都被输入到带有 NAME 和 PRICE 的表中。 如果该客户已取消交易,则添加另一条记录,其中包含 NAME、负 PRICE 和 STATUS = 已取消。这是一个示例表

+------+--------+-----------+
| NAME | PRICE  |  STATUS   |
+------+--------+-----------+
| bob  |    100 |           |
| mary |    100 |           |
| mary |   -100 | cancelled |
| andy |    250 |           |
| mary |    250 |           |
+------+--------+-----------+

我想要做的是删除已取消交易的正面和负面记录,以便生成的表格看起来像这样。

+------+--------+-----------+
| NAME | PRICE  |  STATUS   |
+------+--------+-----------+
| bob  |    100 |           |
| andy |    250 |           |
| mary |    250 |           |
+------+--------+-----------+

关于如何在 SQL 中执行此操作的任何建议?

【问题讨论】:

    标签: mysql sql database-design


    【解决方案1】:

    将表与自身连接以匹配相关记录:

    DELETE t1
    FROM yourTable AS t1
    JOIN yourTable AS t2 ON t1.name = t2.name AND t1.price IN (t2.price, -t2.price)
    WHERE t2.status = 'canceled'
    

    联接查找具有相同名称的行,并且价格是相同的价格或价格的负数。 WHERE 子句将此限制为匹配已取消的行。

    DEMO

    【讨论】:

    • 我遇到语法错误。这需要嵌入到另一个 SELECT * 语句中吗? t2 来自哪里?另外,您能解释一下这种方法的逻辑吗?
    • 抱歉,第二个AS t1 应该是AS t2
    • “FROM”处或附近的语法错误。我在 carto onlines web 界面上的 SQL 编辑器中执行此操作,如果这有什么不同的话
    • 您确定您使用的是 MySQL,而不是其他数据库吗?
    • 不确定他们在 Carto 中使用的是什么 SQL 版本。看看我是否可以修补它并让它工作
    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多