在Oracle中使用自联接批量更新

时间:2012-03-20 06:12:56

标签: sql oracle

我想批量更新同一个表中的某些行。我有一个表,比方说TABLEA,有Id列和OriginalID。我想编写一个内部联接与其他表的组合的查询:

Update TABLEA 
SET OriginalID = Id 
FROM TABLEA A
INNER JOIN TableB B ON <join condition>
INNER JOIN TableC C ON <join condition>
WHERE c.SomeCol = <value>

这适用于SQL Server 2005和Oracle,它提供了错误

  

SQL错误:ORA-00933:SQL命令未正确结束。

2 个答案:

答案 0 :(得分:2)

其他解决方案:

  1. 可更新的观点:

    UPDATE (SELECT OriginalID, ID FROM TABLEA A 
    INNER JOIN TableB B ON <join condition> 
    INNER JOIN TableC C ON <join condition> 
    WHERE c.SomeCol = <value> 
    )  
    SET OriginalID = Id;  
    
  2. 您也可以使用MERGE语句。

    MERGE INTO TableA USING
    (SELECT <used columns, ids> 
    FROM TableB B
    INNER JOIN TableC C ON <join condition> 
    WHERE c.SomeCol = <value>)
    ON (<join condition beteen A and B>)
    WHEN MATCHED THEN 
    UPDATE SET
    OriginalID = ID;
    

答案 1 :(得分:1)

我相信你想要这样的东西。

UPDATE tableA a
   SET OriginalID = (SELECT a2.id
                       FROM tableA a2 
                            JOIN tableB b ON (<<join between a,b,and a2>>)
                            JOIN tableC c ON (<<join between b,and c>>)
                      WHERE c.SomeCol = <<value>>)
 WHERE EXISTS( SELECT 1
                 FROM tableA a2 
                      JOIN tableB b ON (<<join between a,b,and a2>>)
                      JOIN tableC c ON (<<join between b,and c>>)
                WHERE c.SomeCol = <<value>>)