Oracle Объединить в ... Когда не совпадают вставки ... - Могу ли я использовать псевдоним - PullRequest
0 голосов
/ 12 декабря 2018

Вот упрощенный пример таблицы:

MAGIC_TABLE
titi | tata
-----------
val1 | magic1
val2 | magic2
val3 | magic1
val4 | magic1
val5 | magic2

То, чего я хочу добиться, ->

Для каждой строки, которая имеет tata = 'magic2' и какое-то значение в titi, если ононе существует строки 'magic1' с тем же значением тити , тогда я должен добавить строку с titi.value и 'magic1'

Вот упрощенная версия моего SQL-запроса оракула, которыйЯ работаю над:

merge into MAGIC_TABLE magic
using (
    with UNMAGIC_TABLE as (
        select titi, tata from MAGIC_TABLE
        and tata='magic1'
    )
    SELECT titi, tata from UNMAGIC_TABLE 
) really_unmagic
on 
(
  magic.titi = really_unmagic.titi
  magic.tata = really_unmagic.tata
  and magic.tata='magic2'
) 
when not matched then insert (titi, tata) 
values 
(magic.titi, 'magic1');

Почему-то я получаю эту ошибку:

ORA-38101: Неверный столбец в предложении INSERT VALUES: "MAGIC". "TITI"

Так что мне было интересно, если это проблема синтаксиса вокруг псевдонимов?Что я там не так сделал?

РЕДАКТИРОВАТЬ : Это ошибка невнимательности, как отметил Джордж Джозеф, я должен использовать unreally_magic, чтобы она работала, так как когда она не совпадает, я делаюнет строк из magic

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

На вашем месте я бы написал следующее заявление о слиянии:

MERGE INTO magic_table tgt
USING (SELECT titi,
              'magic1' tata
       FROM   magic_table
       WHERE  tata = 'magic2') src
  ON (tgt.titi = src.titi AND tgt.tata = src.tata)
WHEN NOT MATCHED THEN
  INSERT (tgt.titi,
          tgt.tata)
  VALUES (src.titi,
          src.tata);
0 голосов
/ 12 декабря 2018

Я не знаю почему, но, похоже, мне пришлось использовать really_unmagic, чтобы заставить его работать, поэтому мне также пришлось изменить оба условия where, чтобы получить правильные требуемые данные в values.Но я до сих пор не знаю, почему первый запрос не будет работать.

merge into MAGIC_TABLE magic
using (
    with UNMAGIC_TABLE as (
        select titi, tata from MAGIC_TABLE
        and tata='magic2'
    )
    SELECT titi, tata from UNMAGIC_TABLE 
) really_unmagic
on 
(
  magic.titi = really_unmagic.titi
  magic.tata = really_unmagic.tata
  and magic.tata='magic1'
) 
when not matched then insert (titi, tata) 
values 
(really_unmagic.titi, 'magic1');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...