基于多列删除/合并行

时间:2020-05-04 13:57:21

标签: mysql sql

我有下表:

+------------+-----------+--------+----------+-------------+------------------+
|    id      |  order_id | origin | type     | delivery_id | return_requested | 
+------------+-----------+--------+----------+-------------+------------------+
| 42         | 420       |  US    | DELIVERY | d-UUID      |        0         |
+------------+-----------+--------+----------+-------------+------------------+
| 43         | 420       |  US    | RETURN   | r-UUID      |        1         |
+------------+-----------+--------+----------+-------------+------------------+
| 48         | 520       |  US    | DELIVERY | d-UUID      |        0         |
+------------+-----------+--------+----------+-------------+------------------+
| 50         | 520       |  US    | RETURN   | r-UUID      |        1         |
+------------+-----------+--------+----------+-------------+------------------+

其中d-UUIDr-UUID是带有前缀的唯一ID(d用于发送,r用于返回)。

当前,我更改了在数据库中插入数据的方式,而不是每次都添加新行,而是查找order_id并更新现有行。

例如,如果退回订单,我现在将找到id = 42的订单,并将其从类型“ DELIVERY”更新为“ RETURN”,并将“ return_requested”从false更新为true,而delivery_id保持相同。 (这两列类型和return_requested有点多余,但这又是一天了)

但是我现在有很多从delivery_idr-的旧条目,我想删除/合并与order_id相同的行。

我有下面的SQL查找这些行:

SELECT * FROM delivery
WHERE order_id IN (
    SELECT order_id FROM delivery
    WHERE return_requested = 1
    AND delivery_id LIKE '%R-%'
)

但是我不知道如何合并这些行。最后,我要实现这一目标:

+------------+-----------+--------+----------+-------------+------------------+
|    id      |  order_id | origin | type     | delivery_id | return_requested | 
+------------+-----------+--------+----------+-------------+------------------+
| 42         | 420       |  US    | RETURN   | d-UUID      |        1         |
+------------+-----------+--------+----------+-------------+------------------+
| 48         | 520       |  US    | RETURN   | d-UUID      |        1         |
+------------+-----------+--------+----------+-------------+------------------+

编辑:我正在寻找一个更新/删除语句,该语句会使数据库中的数据发生变异,而不是SELECT语句。

3 个答案:

答案 0 :(得分:0)

假设并非所有订单都有退货,则需要左联接才能获得所需的输出:

SELECT
    o.id,
    o.order_id,
    o.origin,
    CASE WHEN r.id NULL THEN o.type ELSE r.type END AS type,
    o.delivery_id,
    CASE WHEN r.id NULL THEN 0 ELSE 1 END AS return_requested,
FROM delivery as o
LEFT JOIN delivery as r
    ON RIGHT(o.delivery_id, len(o.delivery_id)-2) = RIGHT(r.delivery_id, len(r.delivery_id)-2)

要“合并”记录,您可以执行以下操作:

UPDATE o
SET 
    o.type = 'RETURN'
    o.return_requested = 1
from delivery as o
INNER JOIN delivery as r
    ON RIGHT(o.delivery_id, len(o.delivery_id)-2) = RIGHT(r.delivery_id, len(r.delivery_id)-2)

DELETE FROM delivery
WHERE LEFT(delivery_id, 2) = 'r-'

答案 1 :(得分:0)

您可以使用GROUP BY和聚合函数。将结果作为单个输出获取

选择order_id,来源,类型,delivery_id,return_requested FROM交货,其中按order_id,origin,type,delivery_id,return_requested_id分组

答案 2 :(得分:0)

如代码示例所示,您是否可以保证字段id的{​​{1}}始终大于要更新的​​当前ID,并且您不介意在其中包含硬编码的值您的delivery_id子句,您可以使用该查询:

SET
相关问题