首页 > 解决方案 > 基于多列删除/合并行

问题描述

我有下表:

+------------+-----------+--------+----------+-------------+------------------+
|    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-UUID或是r-UUID带有前缀的唯一 ID(d用于交付和r返回)。

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

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

但是我现在有很多旧条目,我想从它们delivery_id开始r-删除/合并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 语句。

标签: mysqlsql

解决方案


假设不是所有的订单都有退货,你需要一个左连接来获得你想要的输出:

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-'

推荐阅读