Oracle
 sql >> база данни >  >> RDS >> Oracle

АКТУАЛИЗАЦИЯ на привидно запазващ ключ изглед в Oracle повдига ORA-01779

Успях да "убедя" Oracle да направи MERGE чрез въвеждане на помощна колона в target:

MERGE INTO (SELECT (SELECT t.account_no FROM dual) AS account_no_temp,
                    t.account_no, t.contract_id 
            FROM t) t
USING (
  SELECT u.account_no_old, u.account_no_new, v.contract_id
  FROM u, v
  WHERE v.tenant_id = u.tenant_id
) s
ON (t.account_no_temp = s.account_no_old AND t.contract_id = s.contract_id)
WHEN MATCHED THEN UPDATE SET t.account_no = s.account_no_new;

db<>демонстрация на fiddle

РЕДАКТИРАНЕ

Вариант на идеята по-горе - подзаявката е преместена директно на ON част:

MERGE INTO (SELECT t.account_no, t.contract_id FROM t) t
USING (
      SELECT u.account_no_old, u.account_no_new, v.contract_id
      FROM u, v
      WHERE v.tenant_id = u.tenant_id
    ) s
ON ((SELECT t.account_no FROM dual) = s.account_no_old
     AND t.contract_id = s.contract_id)
WHEN MATCHED THEN UPDATE SET t.account_no = s.account_no_new;

db<>fiddle demo2

Свързана статия:Колоните, посочени в клаузата ON, не могат да бъдат актуализирани

РЕДАКТИРАНЕ 2:

MERGE INTO (SELECT t.account_no, t.contract_id FROM t) t
USING (SELECT u.account_no_old, u.account_no_new, v.contract_id
       FROM u, v
       WHERE v.tenant_id = u.tenant_id) s
ON((t.account_no,t.contract_id,'x')=((s.account_no_old,s.contract_id,'x')) OR 1=2) 
WHEN MATCHED THEN UPDATE SET t.account_no = s.account_no_new;

db<>fiddle demo3



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle заявка с няколко филтърни условия

  2. не може да запише данни с голям размер с UTL_FILE.PUT_LINE

  3. Какво представлява типът данни MLSLABEL Oracle?

  4. Как да намерите компонентите на EBS R12 Версия

  5. Грешка на Oracle Apex 20.1:Грешка при обработката на валидирането