Oracle合并到...当不匹配时插入...-我可以使用别名

时间:2018-12-12 10:03:34

标签: sql oracle

这是一个简化的表格示例:

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

我想要实现的是->

对于具有tata = 'magic2'titi中的某些值的每一行,如果它不存在具有相同的titi值'magic1'行,那么我应该添加titi.value'magic1'

这是我正在处理的SQL oracle查询的简化版本:

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:“插入值”子句中的无效列:“ MAGIC”。“ TITI”

所以我想知道这是否是别名的语法问题?我在那里做错了什么?

编辑:这是一个疏忽大意的错误,正如乔治·约瑟夫(George Joseph)指出的那样,我必须使用unreally_magic才能使其正常工作,因为当它不匹配时,我没有{{1 }}

2 个答案:

答案 0 :(得分:3)

如果我是你,我会像这样写合并语句:

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

答案 1 :(得分:1)

我不知道为什么,但是似乎我不得不使用really_unmagic使其起作用,所以我还必须更改两个where子句以在{{1}中具有正确的所需数据}。 但是我仍然不知道为什么第一个查询不起作用。

values