Oracle - с клаузулой => слияния? (Ошибка синтаксиса,)

Я пытаюсь заставить предложение 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;

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

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

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

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';
Другие вопросы по тегам