在一个查询中执行两个条件更新

时间:2015-02-24 10:39:21

标签: sql oracle

我是OracleSQL的初学者,我必须

  • 当另一个值为null且
  • 时,将值设置为0
  • 当另一个值不为空时,将值设置为1.

目前,我做了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查询吗?

4 个答案:

答案 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)

你在这做两件事:

  1. 仅更新您在子查询中找到匹配项的记录(即,阻止数据块为block_idt = 1333864且具有相同idt的ut)。
  2. 根据找到的桩子将结果设置为1或0。
  3. 这将是

    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)