Instructie bijwerken met inner join op Oracle

Ik heb een query die prima werkt in MySQL, maar wanneer ik deze op Oracle uitvoer, krijg ik de volgende foutmelding:

SQL-fout: ORA-00933: SQL-opdracht niet correct beëindigd
00933. 00000 – “SQL-opdracht niet correct beëindigd”

De vraag is:

UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';

Antwoord 1, autoriteit 100%

Die syntaxis is niet geldig in Oracle. U kunt dit doen:

UPDATE table1 SET table1.value = (SELECT table2.CODE
                                  FROM table2 
                                  WHERE table1.value = table2.DESC)
WHERE table1.UPDATETYPE='blah'
AND EXISTS (SELECT table2.CODE
            FROM table2 
            WHERE table1.value = table2.DESC);

Of u misschienkunt dit doen:

UPDATE 
(SELECT table1.value as OLD, table2.CODE as NEW
 FROM table1
 INNER JOIN table2
 ON table1.value = table2.DESC
 WHERE table1.UPDATETYPE='blah'
) t
SET t.OLD = t.NEW

Het hangt ervan af of de inline view door Oracle kan worden geüpdatet
(Om bij te werken voor de tweede instructie hangt af van enkele vermelde regels
hier
).


Antwoord 2, autoriteit 48%

Gebruik dit:

MERGE
INTO    table1 trg
USING   (
        SELECT  t1.rowid AS rid, t2.code
        FROM    table1 t1
        JOIN    table2 t2
        ON      table1.value = table2.DESC
        WHERE   table1.UPDATETYPE='blah'
        ) src
ON      (trg.rowid = src.rid)
WHEN MATCHED THEN UPDATE
    SET trg.value = code;

Antwoord 3, Autoriteit 7%

MERGEmet WHEREclausule:

MERGE into table1
USING table2
ON (table1.id = table2.id)
WHEN MATCHED THEN UPDATE SET table1.startdate = table2.start_date
WHERE table1.startdate > table2.start_date;

U hebt de WHEREclausule nodig, omdat kolommen waarnaar wordt verwezen in de ONclausule niet kan worden bijgewerkt.


Antwoord 4, Autoriteit 3%

UPDATE ( SELECT t1.value, t2.CODE
          FROM table1 t1
          INNER JOIN table2 t2 ON t1.Value = t2.DESC
          WHERE t1.UPDATETYPE='blah')
 SET t1.Value= t2.CODE

Antwoord 5, Autoriteit 3%

Gebruik geen enkele van de bovenstaande antwoorden.

Sommigen suggereren het gebruik van genestelde select, doe dat niet, het is ondraaglijk traag. Als je veel records hebt om bij te werken, gebruik je Join, dus zoiets als:

update (select bonus 
        from employee_bonus b 
        inner join employees e on b.employee_id = e.employee_id 
        where e.bonus_eligible = 'N') t
set t.bonus = 0;

Zie deze link voor meer informatie.
http://geekswithblogs.net/Willsmith /archive/2008/06/18/OrAcle-update-with-join-again.aspx .

Zorg er ook voor dat er primaire sleutels zijn op alle tabellen die u bijeen bent.


Antwoord 6, Autoriteit 2%

Zoals aangegeven Hier , de algemene syntaxis voor de eerste Oplossing voorgesteld door Tony Andrews is:

update some_table s
set   (s.col1, s.col2) = (select x.col1, x.col2
                          from   other_table x
                          where  x.key_value = s.key_value
                         )
where exists             (select 1
                          from   other_table x
                          where  x.key_value = s.key_value
                         )

Ik denk dat dit interessant is, vooral als u meer dan één veld wilt bijwerken.


Antwoord 7

Het werkt fijn Oracle

merge into table1 t1
using (select * from table2) t2
on (t1.empid = t2.empid)
when matched then update set t1.salary = t2.salary

Antwoord 8

Deze volgende syntaxis werkt voor mij.

UPDATE
(SELECT A.utl_id,
    b.utl1_id
    FROM trb_pi_joint A
    JOIN trb_tpr B
    ON A.tp_id=B.tp_id Where A.pij_type=2 and a.utl_id is null
)
SET utl_id=utl1_id;

Antwoord 9

Gebruik Beschrijving in plaats van dec voor tabel2,

update
  table1
set
  value = (select code from table2 where description = table1.value)
where
  exists (select 1 from table2 where description = table1.value)
  and
  table1.updatetype = 'blah'
;

Antwoord 10

UPDATE table1 t1
SET t1.value = 
    (select t2.CODE from table2 t2 
     where t1.value = t2.DESC) 
WHERE t1.UPDATETYPE='blah';

Antwoord 11

UPDATE IP_ADMISSION_REQUEST ip1
SET IP1.WRIST_BAND_PRINT_STATUS=0
WHERE IP1.IP_ADM_REQ_ID        =
  (SELECT IP.IP_ADM_REQ_ID
  FROM IP_ADMISSION_REQUEST ip
  INNER JOIN VISIT v
  ON ip.ip_visit_id=v.visit_id
  AND v.pat_id     =3702
  ); `enter code here`

Antwoord 12

UPDATE (SELECT T.FIELD A, S.FIELD B
FROM TABLE_T T INNER JOIN TABLE_S S
ON T.ID = S.ID)
SET B = A;

A en B zijn aliasvelden, u hoeft niet naar de tabel te verwijzen.


Antwoord 13

Voor de volledigheid, en omdat we het over Oracle hebben, zou dit het ook kunnen doen:

declare
begin
  for sel in (
    select table2.code, table2.desc
    from table1
    join table2 on table1.value = table2.desc
    where table1.updatetype = 'blah'
  ) loop
    update table1 
    set table1.value = sel.code
    where table1.updatetype = 'blah' and table1.value = sel.desc;    
  end loop;
end;
/

Antwoord 14

Oracle Base heeft hier een goed overzicht van.

https://oracle-base.com/articles/misc /updates-based-on-queries

Van deze link – ik heb een wijziging van de bovenstaande zoekopdracht gebruikt die niet voor mij werkte (het antwoord van mathguy die rowid gebruikt)

MERGE /*+ APPEND PARALLEL(8) */ INTO dest_table tt
USING source_table st
ON (tt.identifier = st.identifier)
WHEN MATCHED THEN
  UPDATE SET tt.number = st.number;

Hier heb ik twee tabellen: source en dest. Ze hebben allebei een varchar-veld gemeen en ik voeg het source-identificatieveld (PK) toe aan de dest-tabel.


Antwoord 15

update table1  a 
   set a.col1='Y' 
 where exists(select 1 
                from table2 b
               where a.col1=b.col1 
                 and a.col2=b.col2
             )

Other episodes