当我们在 select 中有 case 语句时,使用左外连接进行 Oracle 更新

Posted

技术标签:

【中文标题】当我们在 select 中有 case 语句时,使用左外连接进行 Oracle 更新【英文标题】:Oracle Updates with left outer join when we have case statement in select 【发布时间】:2013-08-27 09:38:24 【问题描述】:

我想知道如何在 Oracle SQL 中编写这个查询:

UPDATE address 
SET    phone1 = sp.phone, 
       is_avlbl = ( CASE 
                      WHEN sp.name IS NULL THEN 1 
                      ELSE 0 
                    END ) 
FROM   address ad 
       LEFT JOIN speaker sp 
              ON sp.addressid = ad.id 

上述查询格式来自 MS SQL Server,但我想用 Oracle 实现类似的功能。

已经看到Update and left outer join statements,这是针对 T-SQL 的。

编辑

我尝试了以下解决方案:

update 
  table1 t1
set
  (
    t1.column1, 
    t1.column2,
    t1.column3
      ) = (
    select
      t2.column1, 
      t2.column2,
      ( CASE 
           WHEN t2.column2 IS NULL THEN 1
              ELSE 0 
              END ) 
    from
      table2  t2
    where
      t2.column1 = t1.column1
     );  

但问题是,当 t2 中没有对应于 t1 的记录时,上面的 sql 将空值插入到 t1 中,因为当没有这样的记录时,我需要在其中插入一些其他值。如果这部分要求之前没有明确,我深表歉意。

【问题讨论】:

请参考***.com/questions/7918688/… Oracle - Update statement with inner join的可能重复 我已经检查了那个问题,但问题是我无法在这里使用该策略...将很快编辑问题 【参考方案1】:

可能是这样的:

merge into address
using 
(
   SELECT ad.id, 
          sp.phone, 
          sp.name 
   FROM address ad 
     LEFT JOIN speaker sp ON sp.addressid = ad.id 
) t on (address.id = t.id)
when matched then update 
     set phone1 = t.phone,
         is_avlbl = case 
                       when t.name is null then 1
                       else 0
                    end;

(这里假设address.id是主键)

虽然没有测试,但可能存在导致语法错误的拼写错误。

【讨论】:

我知道这个解决方案,但我认为它的成本和字节数会非常高 @MozenRath:你检查执行计划了吗?还是您使用自动跟踪运行它?你怎么知道它比简单的UPDATE 更昂贵。不要“假设”这样的事情。测试和验证。 其实我做到了,成本翻了一番

以上是关于当我们在 select 中有 case 语句时,使用左外连接进行 Oracle 更新的主要内容,如果未能解决你的问题,请参考以下文章

go关键字之select

y下面SQL语句如何使用CASE WHEN 将以下两句合并为一句。谢谢! 当

使用 CASE [String] 时 SELECT CASE 语句的奇怪行为

如何根据 CASE 执行不同的 SELECT 语句

sql2005中的case when语句怎么用啊?请写出一个常见的例子

如何使用 case 语句对子选择的结果进行排序