我正在将 H2 UPDATE/SELECT 语句移植到 Oracle,但遇到了无法诊断的语法问题。
我有 3 个表:Users
、Cars
和 Trips
。它们看起来像:
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/