繁体   English   中英

带有 INNER JOIN 的 ORACLE SQL UPDATE 不起作用

[英]ORACLE SQL UPDATE with INNER JOIN isn't working

我目前正在学习 SQL,我正在使用 ORACLE DATABASE。 我已经完成了这个网站的练习: https : //sql.sh/exercices-sql/commandes ,我正在做完全相同的事情,但这次是针对 Oracle 数据库。

我的问题如下:

我有这两个表:

CREATE TABLE orders(
  order_id INT GENERATED BY DEFAULT AS IDENTITY,
  customer_id INT NOT NULL,
  order_date DATE NOT NULL,
  reference VARCHAR(255) NOT NULL,
  total_price_cache DECIMAL(10, 3) NOT NULL,
  PRIMARY KEY(order_id)
);
CREATE TABLE order_lines(
  order_line_id INT GENERATED BY DEFAULT AS IDENTITY,
  order_id INT NOT NULL,
  name VARCHAR(255) NOT NULL,
  quantity INT NOT NULL,
  unit_price DECIMAL(10, 3) NOT NULL,
  total_price DECIMAL(10, 3) NOT NULL,
  PRIMARY KEY(order_line_id)
);

我正在尝试执行以下操作:

UPDATE orders AS t1 
INNER JOIN 
    ( SELECT order_id, SUM(order_lines.total_price) AS p_total 
      FROM order_lines 
      GROUP BY order_id ) t2 
          ON  t1.order_id = t2.order_id 
SET t1.total_price_cache = t2.p_total

我适用于 MySQL,但不适用于 Oracle 数据库。 我不断收到错误 ORA-00971,说缺少关键字 SET。

有人可以向我解释如何为 Oracle 数据库执行此操作。

谢谢

Oracle 不支持这种 MySQL 风格的更新连接语法。 但是,您可以改用相关子查询:

UPDATE orders AS o
SET total_price_cache = (SELECT SUM(total_price) FROM order_lines ol
                         WHERE ol.order_id = o.order_id);

作为更新命令的替代方法,您可以使用merge代替

merge into orders target 
using 
( SELECT t2.order_id , SUM(t2.total_price) AS p_total 
      FROM order_lines t2 inner join orders t1
      ON  t1.order_id = t2.order_id 
      GROUP BY t2.order_id ) source 
    on ( target.order_id = source.order_id ) 
when matched then 
update set target.total_price_cache = source.p_total

您可以使用 join 将 MYSQL 更新转换为 Oracle 中的关键保留视图

UPDATE (SELECT t1.total_price_cache AS total_price_cache,
                t1.order_id,
                t2.order_id
                orders AS t1 ,
                t2.p_total
                FROM orders AS t1
                INNER JOIN 
                ( SELECT order_id, SUM(order_lines.total_price) AS p_total 
                    FROM order_lines 
                    GROUP BY order_id ) t2 
                    ON  t1.order_id = t2.order_id )
SET t1.total_price_cache = t2.p_total

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM