当我们在 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 更新的主要内容,如果未能解决你的问题,请参考以下文章
y下面SQL语句如何使用CASE WHEN 将以下两句合并为一句。谢谢! 当
使用 CASE [String] 时 SELECT CASE 语句的奇怪行为