Update Anweisung mit INNER JOIN auf Oracle
-
20-09-2019 - |
Frage
Ich habe eine Abfrage, die fein in MySQL funktioniert, aber wenn ich laufe es auf Oracle mir die folgende Fehlermeldung erhalten:
SQL-Fehler: ORA-00933: SQL-Befehl nicht richtig beendet
00933. 00000 - "SQL-Befehl nicht richtig beendet"
Die Abfrage ist:
UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';
Lösung
Das Syntax ist in Oracle nicht gültig. Sie können dies tun:
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 Macht der Lage sein, dies zu tun:
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
(Es hängt davon ab, ob der Inline-View aktualisierbar von Oracle betrachtet wird).
Andere Tipps
Verwenden Sie diese:
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;
MERGE
mit WHERE
-Klausel:
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 müssen die WHERE
Klausel, weil Spalten in der ON
-Klausel verwiesen nicht aktualisiert werden kann.
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
Nicht über einige der Antworten verwenden.
Einige schlagen vor, die Verwendung von verschachtelten SELECT, tun Sie das nicht, es quälend langsam ist. Wenn Sie viele Datensätze zu aktualisieren haben, verwenden Sie kommen, so etwas wie:
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;
Siehe diesen Link für weitere Informationen. http://geekswithblogs.net/WillSmith /archive/2008/06/18/oracle-update-with-join-again.aspx .
Sie außerdem sicher, dass es Primärschlüssel für alle Tabellen Sie beitreten.
Wie bereits erwähnt hier , die allgemeine Syntax für die erste Lösung vorgeschlagen von Tony Andrews ist:
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 denke, das ist interessant, vor allem, wenn Sie aktualisieren möchten mehr als ein Feld.
Die 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;
Es funktioniert Orakel
merge into table1 t1
using (select * from table2) t2
on (t1.empid = t2.empid)
when matched then update set t1.salary = t2.salary
Mit Beschreibung statt ab 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'
;
UPDATE table1 t1
SET t1.value =
(select t2.CODE from table2 t2
where t1.value = t2.DESC)
WHERE t1.UPDATETYPE='blah';
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`
Wie eine Frage der Vollständigkeit und weil wir Oracle sprechen, das es tun könnte auch:
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;
/
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 alias Felder, Sie brauchen nicht auf die Tabelle zu verweisen.
update table1 a
set a.col1='Y'
where exists(select 1
from table2 b
where a.col1=b.col1
and a.col2=b.col2
)