【问题标题】:Oracle Updates with left outer join when we have case statement in select当我们在 select 中有 case 语句时,使用左外连接进行 Oracle 更新
【发布时间】: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 中,因为当没有这样的记录时,我需要在其中插入一些其他值。如果这部分要求之前没有明确,我深表歉意。

【问题讨论】:

标签: sql database oracle join sql-update


【解决方案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 更昂贵。不要“假设”这样的事情。测试和验证。
  • 其实我做到了,成本翻了一番
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 2020-02-14
相关资源
最近更新 更多