我是OracleSQL的初学者,我必须
目前,我做了2个SQL查询。
UPDATE UTDIM SET RESULTAT = 1 where utdim.ut_idt in (select b.ut_idt from blockut b, ut u where b.block_idt = 1333864 and u.idt = b.ut_idt and u.pileut is null)
UPDATE UTDIM SET RESULTAT = 0 where utdim.ut_idt in (select b.ut_idt from blockut b, ut u where b.block_idt = 1333864 and u.idt = b.ut_idt and u.pileut is not null)
这只能用1个SQL查询吗?
答案 0 :(得分:0)
是的,也许不是Oracle代码,但现在应该可以使用(经过一些帮助......):
UPDATE UTDIM SET RESULTAT = (select case when u.pileut is null then 1 else 0 end
from blockut b, ut u
where b.block_idt = 1333864
and u.idt = b.ut_idt
and b.ut_idt = utdim.ut_idt)
where utdim.ut_idt in (select b.ut_idt from blockut b, ut u
where b.block_idt = 1333864
and u.idt = b.ut_idt)
答案 1 :(得分:0)
你在这做两件事:
这将是
update utdim
set resultat =
case when
(
select u.pileut
from blockut b
join ut u on u.idt = b.ut_idt
where b.ut_idt = utdim.ut_idt
and b.block_idt = 1333864
) is null then 1 else 0 end
where exists
(
select *
from blockut b
join ut u on u.idt = b.ut_idt
where b.ut_idt = utdim.ut_idt
and b.block_idt = 1333864
);
正如你所看到的,两次做同样的事情(就像我们德国人所说的那样)。您使用相同的子查询来确定要更新哪些记录和以及要更新的值。这可以通过可更新的查询来完成。如果Oracle认为下面的查询可更新,那么它将起作用,否则您将收到错误。
update
(
select utdim.resultat, u.pileut
from utdim
join blockut b on b.ut_idt = utdim.ut_idt and b.block_idt = 1333864
join ut u on u.idt = b.ut_idt
)
set resultat = case when pileut is null then 1 else 0 end;
答案 2 :(得分:0)
是的,可以在一个更新语句中执行此操作:
UPDATE utdim utd
SET utd.resultat = ( SELECT CASE WHEN u.pileut IS NULL THEN 1 ELSE 0
FROM ut u, blockut b
WHERE u.idt = utd.ut_idt
AND u.idt = b.ut_idt
AND b.block_idt = 1333864 )
WHERE EXISTS ( SELECT 1 FROM ut u, blockut b
WHERE u.idt = utd.ut_idt
AND u.idt = b.ut_idt
AND b.block_idt = 1333864 );
我认为我上面的联接是正确的。
答案 3 :(得分:-1)
是的,这是可能的。像
这样的东西update utdim u set
resultat = nvl2(
(select u.pileut
from blockut b
where b.block_idt = 1333864 and u.idt = b.ut_idt),
1, 0)