sql - 通过 self 加入进行更新

标签 sql oracle sql-update ora-00933

我想更新一个表以指示某些行是其他行的父表,因此我在表中添加了“父代”列。以下查询查找所有 parent :

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”行的结尾。

最佳答案

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

关于sql - 通过 self 加入进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2380353/

相关文章:

java - 从Grails应用程序中终止长时间运行的SQL查询

java - SQLITE UPDATE OR INSERT 语句不想执行

mysql - 我的 SQL 语句被执行了两次(我是初学者)

mysql - 使用 group_concat 的单个查询中的多个文本字段

mysql 排名变量

sql - 如何在 sql 查询结果中创建临时序列列?

mysql - 如何在codeigniter中的sql查询中按姓名搜索最新工作的人?

java - oracle jdbc 驱动版本疯狂

MySQL,一次查询更新多个表

sql-server - 使用带有 WHERE 中断的 cte UPDATE SET