Я переношу инструкцию H2 UPDATE/SELECT в Oracle и сталкиваюсь с проблемой синтаксиса, с которой у меня возникает проблема с диагностикой.Oracle UPDATE с использованием оператора SELECT, который включает JOIN
У меня есть 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
.
[Oracle не поддерживает использование пункта факторинга подзапросов в операторе UPDATE] (HTTP: // документы. oracle.com/cd/B28359_01/server.111/b28286/statements_10008.htm#i2112182) - [они могут использоваться только с SELECT] (http://docs.oracle.com/cd/B28359_01/server.111/ b28286/statements_10002.htm # i2065706). –
Спасибо @BobJarvis. Каково обычное обходное решение для такого рода сценариев? Oracle не мой сильный костюм, поэтому «предложение подзапроса факторинга» не является термином, который я бы хотел найти. –