0

我是第一次使用 Oracle 的 SQL Server 开发人员。而且我在使用可以轻松在 SQL 服务器中构建的 UPDATE 语句时遇到问题。

假设我有一个表 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 中解决这个问题。有人可以帮忙吗?

4

3 回答 3

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);
于 2013-03-04T20:35:00.037 回答
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);
于 2013-03-04T20:35:30.490 回答
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 语句。

于 2013-04-04T13:46:40.863 回答