sql - Oracle UPDATE 使用包含 JOIN 的 SELECT 语句

标签 sql oracle join sql-update

我正在将 H2 UPDATE/SELECT 语句移植到 Oracle,但遇到了无法诊断的语法问题。

我有 3 个表:UsersCarsTrips。它们看起来像:

SELECT * FROM USERS;
+------------+----+--------+
|  USERNAME  | ID | CAR_ID |
+------------+----+--------+
| John.Smith |  1 |     5  |
| Abby.Smith |  2 |     6  |
+------------+----+--------+

SELECT * FROM CARS;
+----+--------+-------+
| ID |  MAKE  | COLOR |
+----+--------+-------+
|  5 | Subaru | Green |
|  6 | Honda  | Red   |
+----+--------+-------+

SELECT * FROM TRIPS;
+----+------------+---------+
| ID |  USERNAME  | MILEAGE |
+----+------------+---------+
|  8 | Abby.Smith |      87 |
|  9 | John.Smith |      23 |
+----+------------+---------+

但是,我们现在决定向 Trips 添加一个新列,并(仅)跟踪汽车型号而不是用户。作为中间结果,在删除 USERNAME 列之前,我试图实现:

+----+------------+---------+-----------+
| ID |  USERNAME  | MILEAGE | CAR_MODEL |
+----+------------+---------+-----------+
|  8 | Abby.Smith |      87 |     Honda |
|  9 | John.Smith |      23 |    Subaru |
+----+------------+---------+-----------+

我的(非功能性)声明如下所示:

WITH USER_MODELS AS
(SELECT USERNAME, MAKE FROM USERS JOIN CARS ON (USERS.CAR_ID = CARS.ID))
UPDATE TRIPS SET CAR_MODEL =
    SELECT MAKE FROM USER_MODELS
    WHERE TRIPS.USERNAME = USER_MODELS.USERNAME

但是,我收到的语法错误是:

UPDATE TRIPS SET CAR_MODEL =
*
ERROR at line 3:
ORA-00928: missing SELECT keyword

这让我大吃一惊。 SELECT 语句紧跟在 UPDATE 后面,该语句本身前面有一个 WITH 子句,该子句似乎包含格式正确的 SELECT .

最佳答案

可以做到,但是需要将WITH子句放在子查询中:

UPDATE TRIPS SET CAR_MODEL =
( WITH USER_MODELS AS
       (SELECT USERNAME, MAKE FROM USERS JOIN CARS ON (USERS.CAR_ID = CARS.ID))
  SELECT MAKE FROM USER_MODELS
   WHERE TRIPS.USERNAME = USER_MODELS.USERNAME
);

关于sql - Oracle UPDATE 使用包含 JOIN 的 SELECT 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32206069/

相关文章:

arrays - 连接两个 Scala 数组

mysql - 内连接 : Mysql prints more lines than available (same multiple rows)

sql - 如何从oracle中的层次结构中查询

sql - SQLite3中的窗口函数

mysql - 使用左连接从多个表中删除行

Spring 批处理 - ORA-08177

mysql - 使用 count(*) 和 inner join 时查询速度慢

sql - 为什么我的查询不可搜索

java - -Xss 和 -XX :ThreadStackSize? 有什么区别

PHP 字符串未格式化为有效的 XML