Sql 联接表的UPDATE语句

Sql 联接表的UPDATE语句,sql,oracle,Sql,Oracle,我是一名SQL Server开发人员,第一次与Oracle合作。我在SQL server中很容易构建的UPDATE语句中遇到了问题 假设我有一个表T1,列为KeyVal1、Keyval2、KeyVal3、NonKeyVal1。。。 KeyVal1 2和3是复合键 我还有一个表T2,它与T1的复合键有外键关系。如果T2中存在记录,我想更新T1.NonKeyVal1和T1.NonKeyVal2 在T-SQL中,我会写: Update T1 Set NonKeyVal1 = 'x',

我是一名SQL Server开发人员,第一次与Oracle合作。我在SQL server中很容易构建的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中很难理解这一点。有人能帮忙吗?

试试这个

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);
试试这个

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

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

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

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

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

如果要根据T2中的值更新T1,并且要在某些列上连接到T2中的值,那么在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';
如果没有约束,那么以前有一个非官方的解决方法,使用未记录的Optimizer提示来绕过更新连接基数检查,但这不是很安全


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

如果您根据T2中的值更新T1,并且在某些列上联接到T2中,然后,在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';
如果没有约束,那么以前有一个非官方的解决方法,使用未记录的Optimizer提示来绕过更新连接基数检查,但这不是很安全


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

您可以在sql server中编写它,并将服务器链接到Oracle。您可以在sql server中编写它,并将服务器链接到oracleD'oh!我不知道为什么我没有想到这一点。非常感谢。哦!我不知道为什么我没有想到这一点。非常感谢。