Oracle:更新字段到' T'基于子查询

时间:2016-12-07 22:18:22

标签: sql oracle

我有一个表,我试图根据聚合查询添加一个布尔标志字段。在没有提供客户信息的情况下尝试以最简单的形式表达这一点,我将表格MyTable称为字段An,Ver,Co和Rep。

MyTable
An     Ver     Co     Rep    NewFlag
A       1      Aa      T     
A       1      Ab      F
A       1      Ac      T
B       1      Ba      F
B       1      Bb      F
B       1      Bc      T
C       1      Ca      F
C       1      Cb      T
C       1      Cc      F

我想设置NewFlag =' T'对于An,Ver,Co的分组,只有一个Rep =' T'否则它可以保持为空。

我有一个查询标识了An,Ver,Co,其中Reps的计数=' T' = 1,并希望使用类似以下的结果网站作为我的条件来更新NewFlag字段

QueryResults
An     Ver     Co       
B       1      Bc
C       1      Cb 

在某种程度上,它会是这样的:

Update MyTable
Set NewFlag = 'T' 
where
MyTable.An = QueryResults.An,
MyTable.Ver = QueryResults.Ver,
MyTable.Co = QueryResults.Co

QueryResults是我的查询的结果集,它标识那些只有一个Rep =' T'的记录。

除了使用脚本循环遍历并逐个更新记录之外,是否有语法可以插入我的查询以更新这些特定字段?

2 个答案:

答案 0 :(得分:3)

您需要相关子查询或in。像这样:

Update MyTable
    Set NewFlag = 'T' 
    where (An, Ver, Co) in (select An, Ver, Co
                            from <your query>
                           );

答案 1 :(得分:0)

MERGE非常适合这种作业:

merge into mytable m
  using ( select   an, ver, co 
          from     mytable
          where    rep = 'T'
          group by an, ver, co
          having   count(*) = 1
        ) x
    on ( m.an = x.an and m.ver = x.ver and m.co = x.co )
when matched then update set newflag = 'T'
;