Oracle WITH CLAUSE => MERGE? (Ошибка синтаксиса, )

Я пытаюсь заставить предложение WITH работать со слиянием в Oracle, но по какой-то причине я не могу заставить его работать. Я уверен, что это что-то очевидное, но я просто не видел этого.

-- behold, the wonders of fake data
WITH X AS ( 
SELECT 
  'moo' AS COW, 
  'woof' AS CAT, 
  (SELECT MAX( DECIBELS ) FROM ANIMALIA WHERE COW = 'moo' ) AS DECIBELS
FROM DUAL )
MERGE INTO ANIMALIA D 
USING X
WHEN MATCHED THEN
    UPDATE SET D.COW = X.COW;

РЕДАКТИРОВАТЬ

На самом деле я узнал, как с этим справиться (до того, как задал вопрос), но я думаю, что, поскольку мне потребовалось довольно много времени, чтобы найти ответ, надеюсь, оставление этого вопроса будет означать, что следующий человек найдет его не совсем так. много времени.

Я опубликую ответ через день или около того, но если кто-то другой отправит его тем временем, он получит баллы.


person cwallenpoole    schedule 13.07.2011    source источник
comment
ORA-00928: отсутствует ключевое слово SELECT   -  person cwallenpoole    schedule 13.07.2011
comment
На самом деле подзапрос не имел никакого отношения к проблеме в конце концов.   -  person cwallenpoole    schedule 13.07.2011
comment
@OMG, я могу ответить на это и отметить это как таковое, но если кто-то знает не понаслышке, он может оценить баллы, понимаете? (Есть мысли по теме?)   -  person cwallenpoole    schedule 13.07.2011
comment
@OMG Я могу отправить его вам, если хотите.   -  person cwallenpoole    schedule 13.07.2011


Ответы (1)


Вы не можете использовать предложение WITH где-либо, кроме оператора SELECT. см. документацию здесь.:

Вы можете указать это предложение в любом операторе SELECT верхнего уровня и в большинстве типов подзапросов.

Итак, вы можете сделать что-то вроде этого (проверено 11g):

MERGE INTO animalia d
USING (WITH X AS 
       (SELECT  'moo' AS COW, 'woof' AS CAT, 
                (SELECT MAX( DECIBELS ) 
                   FROM ANIMALIA 
                  WHERE COW = 'moo' ) AS DECIBELS
          FROM DUAL )
       SELECT * FROM X) q ON (1 = 1)
 WHEN MATCHED THEN UPDATE SET d.cow = q.cow||' and more';
person DCookie    schedule 13.07.2011
comment
Спасибо. Счастливые очки. Мое решение было USING (SELECT... ) X ON, но я думаю, что оба делают одно и то же. - person cwallenpoole; 13.07.2011
comment
Конечно, я думал, что упражнение заключается в использовании предложения WITH в операторе MERGE ;-) - person DCookie; 13.07.2011
comment
Честно говоря, мне было все равно, как только я заработал, но я очень рад, что у нас есть оба синтаксиса (для следующего парня) - person cwallenpoole; 13.07.2011
comment
Но вы по-прежнему не можете использовать исходный встроенный вид в WHEN MATCHED THEN DELETE :( - person Elnur; 28.10.2019