Oracle更新语句 - 如何链接到相关表?

时间:2010-10-07 13:05:20

标签: oracle

我是Oracle的新手,在我职业生涯的大部分时间里都在使用MS SQL。我习惯这样做:

update t
set Col1 = o.Col2
from MyTable t 
join OtherTable o on t.OtherID = o.ID

我在Oracle中尝试了这种语法,但它不接受它。看着Oracle docs,找不到我想要做的例子。

你是怎么做到的?

5 个答案:

答案 0 :(得分:3)

选项A)相关子查询

UPDATE MyTable t
  SET Col1 = (SELECT o.col2 FROM OtherTable o WHERE t.OtherID = o.ID)

这要求子查询为正在更新的表中的每一行返回不超过1的匹配项。如果它不返回任何匹配项,则该列将使用NULL更新,这可能不是您想要的。您可以添加WHERE EXISTS (SELECT o.col2 FROM OtherTable o WHERE t.OtherID = o.ID)以使更新仅发生在匹配项的位置。

选项B)更新连接视图

UPDATE (SELECT t.col1, o.col2 FROM MyTable t JOIN OtherTable o ON t.otherID = o.ID)
  SET col1 = col2

这更接近您以前的工作。它只有在Oracle可以为连接中的每一行确定基础表中的唯一行时才会起作用 - 我认为这基本上意味着ID必须是otherTable的唯一键。

答案 1 :(得分:2)

update (select t.OtherID, t.Col1  , o.ID, o.Col2 from MyTable t 
join OtherTable o on t.OtherID = o.ID) a
set a.Col1 = a.Col2

答案 2 :(得分:1)

update MyTable t
set Col1 = (SELECT o.Col2 from OtherTable o
            WHERE t.OtherID = o.ID)
where exists (SELECT o.Col2 from OtherTable o
            WHERE t.OtherID = o.ID)

“where exists”部分是为了防止在OtherTable中没有匹配的MyTable行将col1设置为NULL - 假设这可能发生并且需要被阻止。

答案 3 :(得分:1)

您可以像这样使用临时表:

update
(
    select t.Col1, o.Col2
    from MyTable t
    join OtherTable o
        on t.OtherID = o.ID
) tmp
set tmp.Col1 = tmp.Col2

答案 4 :(得分:0)

update MyTable t
set Col1 = (SELECT o.Col2 from OtherTable o
            WHERE t.OtherID = o.ID)