it-swarm.com.de

Update-Anweisung mit innerem Join auf Oracle

Ich habe eine Abfrage, die in MySQL einwandfrei funktioniert, aber wenn ich sie unter Oracle laufe, bekomme ich die folgende Fehlermeldung:

SQL-Fehler: ORA-00933: SQL-Befehl wurde nicht ordnungsgemäß beendet
00933. 00000 - "SQL-Befehl nicht ordnungsgemäß beendet"

Die Abfrage lautet:

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

Diese Syntax ist in Oracle nicht gültig. Du kannst das:

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

Oder Sie könnten können das:

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

(Dies hängt davon ab, ob die Inline-Ansicht von Oracle als aktualisierbar erachtet wird).

352
Tony Andrews

Benutze das:

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;
181
Quassnoi

Zusammenführen mit wo Klausel für mich gearbeitet hat:

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;

Sie benötigen die WHERE-Klausel, da in der ON-Klausel referenzierte Spalten nicht aktualisiert werden können.

18
Roland
 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
13
Morten Anderson

Wie angegeben here , lautet die allgemeine Syntax für die erste von Tony Andrews vorgeschlagene Lösung:

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
                         )

Ich finde das besonders interessant, wenn Sie mehr als ein Feld aktualisieren möchten.

7
Alexis Dufrenoy

Verwenden Sie nicht einige der obigen Antworten. 

Einige schlagen die Verwendung von geschachteltem SELECT vor, tun Sie das nicht, es ist quälend langsam. Wenn Sie viele Datensätze zum Aktualisieren haben, verwenden Sie join.

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;

Weitere Informationen finden Sie unter diesem Link . http://geekswithblogs.net/WillSmith/archive/2008/06/18/Oracle-update-with-join-again.aspx .

Stellen Sie außerdem sicher, dass in allen Tabellen, an denen Sie teilnehmen, Primärschlüssel vorhanden sind.

5
duvo

Diese folgende Syntax funktioniert für mich.

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;
2
Hemant

Es funktioniert gut Oracle

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

Verwenden von description anstelle von desc für table2,

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'
;
1
Janek Bogucki

Nur aus Gründen der Vollständigkeit, und weil wir von Oracle sprechen, könnte dies auch gut sein:

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;
/
0
Edu Castrillon
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 und B sind Aliasfelder, Sie müssen nicht auf die Tabelle zeigen.

0
Dan Anderson
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`
0
user5685973
UPDATE table1 t1
SET t1.value = 
    (select t2.CODE from table2 t2 
     where t1.value = t2.DESC) 
WHERE t1.UPDATETYPE='blah';
0
afnhsn