2015-08-25 5 views
0

Я переношу инструкцию 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.

+0

[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). –

+0

Спасибо @BobJarvis. Каково обычное обходное решение для такого рода сценариев? Oracle не мой сильный костюм, поэтому «предложение подзапроса факторинга» не является термином, который я бы хотел найти. –

ответ

2

Это может быть сделано, но вы должны положить спецификатор внутри подзапрос:

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 
); 
+0

Это прекрасно работает - спасибо Тони. Поддерживает «чувство» оригинального заявления. –

Смежные вопросы