تحديث بيان مع الانضمام الداخلي على Oracle
-
20-09-2019 - |
سؤال
لدي استعلام يعمل بشكل جيد في MySQL، ولكن عندما أقوم بتشغيله على Oracle، أحصل على الخطأ التالي:
خطأ SQL: ORA-00933: أمر SQL غير المنتهي بشكل صحيح
00933. 00000 - "الأمر SQL غير منه انتهى بشكل صحيح"
الاستعلام هو:
UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';
المحلول
هذا الجملة غير صالح في أوراكل. يمكنك ان تفعلها:
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);
او انت ربما تكون قادرة على القيام بذلك:
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
(يعتمد ذلك على ما إذا كان العرض المضمن يعتبر قابلة للتحديث بواسطة Oracle).
نصائح أخرى
استخدم هذا:
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
مع WHERE
بند:
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;
تحتاج إلى WHERE
جملة لأن الأعمدة المشار إليها في ON
يمكن تحديث جملة.
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
لا تستخدم بعض الإجابات أعلاه.
يقترح البعض استخدام الاختيار المتداخل، لا تفعل ذلك، فهي بطيئة مبكغة. إذا كان لديك الكثير من السجلات للتحديث، استخدم الانضمام، لذلك شيء مثل:
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;
انظر هذا الرابط لمزيد من التفاصيل.http://geekswithblogs.net/willsmith/archive/2008/06/18/oracle-update-with-join-again.aspx..
أيضا، تأكد من وجود مفاتيح أساسية على جميع الجداول التي تنضم إليها.
كما هو مبين أو كما هو محدد أو كما هو مشار اليه هنا, ، بناء الجملة العام للحل الأول الذي اقترحته توني أندروز هو:
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
)
أعتقد أن هذا مثير للاهتمام خاصة إذا كنت تريد تحديث أكثر من حقل واحد.
بناء الجملة التالي يعمل بالنسبة لي.
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;
انها تعمل بخير أوراكل
merge into table1 t1
using (select * from table2) t2
on (t1.empid = t2.empid)
when matched then update set t1.salary = t2.salary
استخدام وصف بدلا من DESC for 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`
تماما كمسألة اكتمال، ولأننا نتحدث أوراكل، فإن هذا يمكن أن يفعل ذلك كذلك:
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 و B هي حقول الاسم المستعار، لا تحتاج إلى توجيه الجدول.
update table1 a
set a.col1='Y'
where exists(select 1
from table2 b
where a.col1=b.col1
and a.col2=b.col2
)