问。创建一个新列 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;
行数:
请注意我正确更改了日期列的数据类型。
我做过的事:
我在“运输”表中添加了所需的列,因为没有对此进行任何指定(应该添加到哪个表或其他)。相同的查询:
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
最好不要存储冗余数据,因为总是存在不一致的风险,这只是不必要的存储。
就是一个普通的多桌更新:
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;
如果仍然不起作用,您可以尝试进一步减小批量大小。