Обновление с самостоятельным присоединением - PullRequest
4 голосов
/ 04 марта 2010

Я хочу обновить таблицу, чтобы указать, что некоторые строки являются родителями других, поэтому я добавил столбец "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 ]

10 голосов
/ 04 марта 2010

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
3 голосов
/ 23 июля 2015

Мне кажется, что следующий стиль проще для чтения, но вам нужно использовать псевдоним после ключевого слова ОБНОВЛЕНИЕ, а не имя таблицы:

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'
0 голосов
/ 09 мая 2017
-- 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
...