Обновление с самосоединение
Я хочу обновить таблицу, чтобы указать, что некоторые строки являются родителями других, поэтому я добавил столбец "parentid" в таблицу. Следующий запрос находит всех родителей:
SELECT ca1.id, ca2.id
FROM contactassociations ca1
JOIN contactassociations ca2 ON (ca1.contactid = ca2.contactid)
where ca1.entitytable = 'EMPLOYER' AND
ca2.entitytable = 'CLIENT';
Но когда я пытаюсь адаптировать этот синтаксис для обновления, он не работает:
UPDATE contactassociations ca1
SET ca1.parentid = ca2.id
JOIN contactassociations ca2 ON (ca1.contactid = ca2.contactid)
WHERE ca1.entitytable = 'EMPLOYER' AND ca2.entitytable = 'CLIENT';
Я получаю:
Error starting at line 6 in command:
UPDATE contactassociations ca1
SET ca1.parentid = ca2.id
JOIN contactassociations ca2 ON (ca1.contactid = ca2.contactid)
WHERE ca1.entitytable = 'EMPLOYER' AND ca2.entitytable = 'CLIENT'
Error at Command Line:7 Column:28
Error report:
SQL Error: ORA-00933: SQL command not properly ended
00933. 00000 - "SQL command not properly ended"
*Cause:
*Action:
Обратите внимание, что строка 7 столбец 28 является концом строки "SET".
3 ответов:
Oracle не поддерживает предложение
JOINв операторахUPDATE.Используйте это:
MERGE INTO contactassociations ca1 USING contactassociations ca2 ON ( ca1.contactid = ca2.contactid AND ca1.entitytable = 'EMPLOYER' AND ca2.entitytable = 'CLIENT' ) WHEN MATCHED THEN UPDATE SET parentid = ca2.id
Я нахожу следующий стиль более простым для чтения, но вам нужно использовать псевдоним после ключевого слова обновления, а не имя таблицы:
UPDATE ca1 SET ca1.parentid = ca2.id FROM contactassociations ca1 LEFT JOIN contactassociations ca2 ON (ca1.contactid = ca2.contactid) WHERE ca1.entitytable = 'EMPLOYER' AND ca2.entitytable = 'CLIENT'
-- Method #1 update emp set MANAGERNAME= mgr.EMPNAME FROM SelfJoinTable emp , SelfJoinTable mgr where emp.MANAGERID = mgr.EMPID -- Method #2 update emp set MANAGERNAME= mgr.EMPNAME FROM SelfJoinTable emp LEFT OUTER JOIN SelfJoinTable mgr ON emp.MANAGERID = mgr.EMPID -- Method #3 update emp set MANAGERNAME= mgr.EMPNAME FROM SelfJoinTable emp JOIN SelfJoinTable mgr ON emp.MANAGERID = mgr.EMPID -- Method #4 update emp set MANAGERNAME= mgr.EMPNAME FROM SelfJoinTable emp inner JOIN SelfJoinTable mgr ON emp.MANAGERID = mgr.EMPID
Comments