2015-11-20 1 views
1

У меня есть две таблицы:Oracle ошибка 11g в слиянии с использованием ссылки на новую запись в вставки заявления

CREATE TABLE 
    test 
    (
     id INTEGER, 
     str VARCHAR2(10) 
    ); 
CREATE TABLE 
    test2 
    (
     id INTEGER, 
     tmp VARCHAR2(10) 
    ); 

и содержание:

INSERT INTO test2 (id, tmp) VALUES ( 10,'tmp10'); 
INSERT INTO test2 (id, tmp) VALUES ( 20,'tmp20'); 

Когда работает следующий скрипт:

MERGE INTO test mt 
USING (
     SELECT 
      1 AS id, 
      10 AS id2 
     FROM 
      dual) nr 
ON ( mt.id=nr.id) 
WHEN MATCHED THEN 
    UPDATE SET str=(SELECT id FROM test2 WHERE  id=nr.id2) 
WHEN NOT MATCHED THEN 
    INSERT (id,str) VALUES ( nr.id,(SELECT tmp FROM test2 WHERE id=nr.id2)); 

Я вижу ошибку:

[Error Code: 904, SQL State: 42000] ORA-00904: "NR"."ID2": invalid identifier 

Но когда я работаю:

MERGE INTO test mt 
USING (
     SELECT 
      1 AS id, 
      10 AS id2 
     FROM 
      dual) nr 
ON ( mt.id=nr.id) 
WHEN MATCHED THEN 
    UPDATE SET str=(SELECT id FROM test2 WHERE  id=nr.id2) 
WHEN NOT MATCHED THEN 
    INSERT (id,str) VALUES ( nr.id,(SELECT tmp FROM test2 WHERE id=10)); 

это работает.

Почему ссылка на новую запись работает в операторе обновления, но не работает в инструкции insert?

ответ

1

Попробуйте это ... обратите внимание на изменения в MERGE ...

1) в пункте USING, убедитесь, что у вас есть ПОЛНЫЙ запрос, который возвращает результаты, которые вы хотите ..

2) Добавленный будет ссылаться на значении непосредственно оттуда .. НЕ из подзапроса в ВСТАВИТЬ юг заявление ..

SQL> select * from test; 

    no rows selected 

    SQL> select * from test2; 

      ID TMP 
    ---------- ---------- 
      10 tmp10 
      20 tmp20 

    SQL> SELECT id, tmp 
    2 FROM test2 
    3 WHERE id IN (1, 10) 
    4/

      ID TMP 
    ---------- ---------- 
      10 tmp10 

    SQL> MERGE INTO test mt 
    2  USING (
    3  SELECT id, tmp 
    4   FROM test2 
    5   WHERE id IN (1, 10) 
    6  ) nr 
    7  ON (mt.id = nr.id) 
    8  WHEN MATCHED THEN 
    9  UPDATE set str = nr.tmp 
    10  WHEN NOT MATCHED THEN 
    11  INSERT (id, str) VALUES (nr.id, nr.tmp) 
    12/

    1 row merged. 

    SQL> commit; 

    Commit complete. 

    SQL> select * from test; 

      ID STR 
    ---------- ---------- 
      10 tmp10 

    SQL> 

Или проверить/проверить ВСТАВИТЬ часть:

SQL> MERGE INTO test mt 
    2  USING (
    3  SELECT id, tmp 
    4   FROM test2 
    5   WHERE id IN (1, 10, 20) 
    6  ) nr 
    7  ON (mt.id = nr.id) 
    8  WHEN MATCHED THEN 
    9  UPDATE set str = nr.tmp 
    10  WHEN NOT MATCHED THEN 
    11  INSERT (id, str) VALUES (nr.id, nr.tmp) 
    12/

    2 rows merged. 

    SQL> select * from test; 

      ID STR 
    ---------- ---------- 
      10 tmp10 
      20 tmp20 

    SQL> 
+0

Спасибо, это работает. –