MySQL,向已有表添加新列,也涉及连接

问题描述 投票:0回答:1

问。创建一个新列 DaysTakenForDelivery,其中包含 Order_Date 和 Ship_Date 之间的日期差异。

可用的表格是:订单和运输

CREATE TABLE orders (
    Order_ID int DEFAULT NULL,
    Order_Date text,
    Order_Priority text,
    Ord_id text
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE shipping (
    Order_ID int DEFAULT NULL,
    Ship_Mode text,
    Ship_Date text,
    Ship_id text,
    DaysTakenForDelivery` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

行数:

  • 运费:7701
  • 订单:5506

请注意我正确更改了日期列的数据类型。

我做过的事:

我在“运输”表中添加了所需的列,因为没有对此进行任何指定(应该添加到哪个表或其他)。相同的查询:

ALTER TABLE shipping ADD DaysTakenForDelivery INT;

接下来,我尝试使用各种查询来更新列,但没有任何效果。下面列出了其中的一些:

失败的尝试:

UPDATE shipping SET DaysTakenForDelivery = (
    select datediff(b.ship_date, a.order_date) AS DaysTakenForDelivery 
    from orders a
    JOIN shipping b ON a.Order_ID = b.Order_ID
);

注意:此查询导致以下错误:

错误代码:1093。您不能在 FROM 子句中指定要更新的目标表 'shipping_dimen'

我试过的下一个查询:

UPDATE shipping b SET DaysTakenForDelivery = (
    select datediff(b.ship_date, a.order_date) AS DaysTakenForDelivery 
    from orders a  
    WHERE a.Order_ID = b.Order_ID
);

注意:此查询导致以下错误:

错误代码:1242。子查询返回多于 1 行

我应该如何达到预期的结果?

请注意,我正在使用 MySQL,对于相同 RDBMS 的答案将不胜感激,以便更好地理解。

我使用的版本:8.0.31

mysql join subquery ddl dml
1个回答
0
投票

最好不要存储冗余数据,因为总是存在不一致的风险,这只是不必要的存储。

就是一个普通的多桌更新

UPDATE shipping s
JOIN orders o ON s.Order_ID = o.Order_ID
SET s.DaysTakenForDelivery = DATEDIFF(s.Ship_Date, o.Order_Date);

由于您在尝试更新表时出现性能问题,您可以尝试批量更新:

UPDATE shipping s
JOIN (
    SELECT s.ship_id, DATEDIFF(s.ship_date, o.order_date) AS diff
    FROM orders o
    JOIN shipping s ON o.order_id = s.order_id
    WHERE s.DaysTakenForDelivery IS NULL
    ORDER BY o.order_id, s. ship_id
    LIMIT 1000 -- batch size
) sd ON s.ship_id = sd.ship_id
SET s.DaysTakenForDelivery = sd.diff;

如果仍然不起作用,您可以尝试进一步减小批量大小。

© www.soinside.com 2019 - 2024. All rights reserved.