2010-03-04 53 views
4

我想更新一個表以指示某些行是其他父項,因此我在該表中添加了「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」行的結尾。

回答

9

Oracle不支持在UPDATE語句中的JOIN子句。

使用此:

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 
+0

我從來沒有聽說過「MERGE」。謝謝。 – 2010-03-04 15:35:31

+0

@Paul:在一個語句中它是'INSERT','UPDATE'和'DELETE'。 'SQL Server'也支持它(因爲'2008') – Quassnoi 2010-03-04 15:39:10

+0

+1,合併是你的朋友 – DCookie 2010-03-04 16:17:30

3

我找到以下樣式簡單的閱讀,但你需要使用別名的UPDATE關鍵字後面,而不是表名:

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
-- 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