使用Join(s)更新 - 多DB /表

时间:2011-03-07 09:52:05

标签: sql sql-server oracle

我有一个场景,我想只使用一个实例更新多个表中的多个字段。我需要一个语法来对多个数据库(Oracle和MSSQL)执行此类操作。

目前我被MSSQL的以下声明所困:

update table1
set table1.value = 'foo'
from table1 t1 join table2 t2 on t1.id = t2.tab1_id
where t1.id = 1234

我想更新t2中的字段以及同一声明。

此外,我想在Oracle上执行相同的更新。

编辑:左看起来我只能在一个语句中更新多个表。

是否有一种语法适用于使用Oracle和MSSql进行更新时加入?

此致

2 个答案:

答案 0 :(得分:0)

在Oracle上,您只能更新一个表,但您可以考虑使用触发器。

答案 1 :(得分:0)

  

好像我无法更新多个   只有一个陈述中的表格。

     

是否有适用的语法   使用a更新时的Oracle和MSSql   加入?

我假设当您重新提出问题时,您希望语法可以在Oracle和SQL Server上运行,即使它不可避免地只会影响一个表。

两个平台都支持入门级SQL-92标准代码,因此以下“标量子查询”SQL-92代码应该可以工作:

UPDATE table1 
   SET my_value = (
                   SELECT t2.tab1_id
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  )       
 WHERE id = 1234
       AND EXISTS (
                   SELECT * 
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  );

请注意,虽然t1使用Ttble1的相关名称是有效的语法,但根据SQL-92标准,这将实现表格,然后UPDATE将定位物化表格“ t1'并使你的基表'table1`不受影响,我认为这不是理想的影响。虽然我非常确定Oracle和SQL Server都不符合这一点,并且在实践中可以按预期工作,但是通过完全限定目标表来保持超级谨慎并坚持SQL-92语法并没有坏处。

民众倾向于不喜欢上述子查询中的“重复”代码(即使优化器应该足够聪明,只能评估一次)。

更新版本的Oracle和SQL Server支持都支持标准SQL:2003 MERGE语法,可能会使用与此类似的内容:

MERGE INTO table1 
   USING (
          SELECT t2.tab1_id
            FROM table2 AS t2
         ) AS source
      ON id = source.tab1_id
         AND id = 1234
WHEN MATCHED THEN
   UPDATE
      SET my_value = source.tab1_id;

我刚刚注意到你的例子比我最初想的更简单,只需要一个应该在大多数SQL产品上运行的简单子查询,例如:

UPDATE table1
   SET my_value = 'foo'
 WHERE EXISTS (
               SELECT * 
                 FROM table2 AS t2 
                WHERE t2.tab1_id = table1.id
              );