sql >> Database >  >> RDS >> Oracle

UPDATE over ogenschijnlijk belangrijke behoudsweergave in Oracle verhoogt ORA-01779

Ik ben erin geslaagd Oracle te "overtuigen" om MERGE te doen door een helperkolom in doel te introduceren:

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-demo

BEWERKEN

Een variatie op het bovenstaande idee - subquery is direct verplaatst naar ON deel:

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

Gerelateerd artikel:Kolommen waarnaar wordt verwezen in de ON-clausule kunnen niet worden bijgewerkt

BEWERK 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. Query optimaliseren met datediff() in mysql

  2. Toepassingen die op Linux draaien verbinden met Amazon Relational Database Services (RDS) voor SQL Server

  3. stop bij compilatiefout in een sqlplus-script

  4. Hoe u de huidige datum in Oracle kunt krijgen