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

时间:2013-08-27 09:38:24

标签: sql database oracle join sql-update

我想知道如何在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中,因为当没有这样的记录时我需要插入其他值。如果这部分要求不清楚,我道歉。

1 个答案:

答案 0 :(得分: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是主键)

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

相关问题