已连接表的UPDATE语句

时间:2013-03-04 20:31:28

标签: sql oracle

我是第一次与Oracle合作的SQL Server开发人员。我在UPDATE语句中遇到问题,我可以在SQL服务器中轻松构建。

假设我有一个表T1,其中包含KeyVal1,Keyval2,KeyVal3,NonKeyVal1,...... KeyVal1 2和3是复合键。

我也有表T2与T1的复合键有外键关系。如果记录存在于T2中,我想更新T1.NonKeyVal1和T1.NonKeyVal2。

在T-SQL中我会写:

Update T1
Set    NonKeyVal1 = 'x',
       NonKeyVal2 = 'y'
FROM   T1
JOIN   T2 ON T1.KeyVal1 = T2.KeyVal1 AND 
             T1.KeyVal2 = T2.KeyVal2 AND 
             T1.KeyVal3 = T2.KeyVal3;

但是我在Oracle SQL中无法解决这个问题。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

试试这个

Update T1
Set    NonKeyVal1 = 'x',
       NonKeyVal2 = 'y'
FROM   T1 WHERE EXISTS (
SELECT 1 FROM T2 WHERE T1.KeyVal1 = T2.KeyVal1 AND 
             T1.KeyVal2 = T2.KeyVal2 AND 
             T1.KeyVal3 = T2.KeyVal3);

答案 1 :(得分:1)

您需要将其写为相关子查询:

update t1
set    nonkeyval1 = 'x'
where  exists (select null
               from   t2
               where  t1.keyval1 = t2.keyval1
               and    t1.keyval2 = t2.keyval2
               and    t1.keyval3 = t3.keyval3);

答案 2 :(得分:1)

如果您根据加入某些列的T2中的值更新T1,那么在Oracle中,如果通过表上的约束保证连接列是唯一的,则可以编写可更新的视图。

因此,如果keyval1,keyval2和keyval3上有唯一或主键约束,您可以写...

Update (
  select t1.NonKeyVal1 t1_NonKeyVal1,
         t1.NonKeyVal2 t1_NonKeyVal2,
         t2.NonKeyVal1 t2_NonKeyVal1,
         t2.NonKeyVal2 t2_NonKeyVal2
  from   t1 join t2 on (
           T1.KeyVal1 = T2.KeyVal1 AND 
           T1.KeyVal2 = T2.KeyVal2 AND 
           T1.KeyVal3 = T2.KeyVal3))
set t1_NonKeyVal1 = t2_NonKeyVal1,
    t1_NonKeyVal2 = t2_NonKeyVal1;

你的案子可以更加简单:

Update (
  select t1.NonKeyVal1,
         t1.NonKeyVal2
  from   t1 join t2 on (
           T1.KeyVal1 = T2.KeyVal1 AND 
           T1.KeyVal2 = T2.KeyVal2 AND 
           T1.KeyVal3 = T2.KeyVal3))
set NonKeyVal1 = 'x',
    NonKeyVal2 = 'y';

如果没有约束,那么曾经有一个非官方的解决方法,它使用了一个未记录的优化器提示来绕过更新连接基数检查,但它并不是非常安全。

现在如果你没有约束,你可以使用MERGE语句,如果你需要引用连接表中的值,或者你的情况更简单,其他人建议的相关子查询就足够了。