0

我想知道如何在 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 实现类似的功能。

已经看过更新和左外连接语句,这是针对 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 中,因为当没有这样的记录时,我需要在其中插入一些其他值。如果这部分要求之前不清楚,我深表歉意。

4

1 回答 1

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是主键)

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

于 2013-08-27T12:04:15.293 回答