SQL Query用于查找不同的记录和更新表

时间:2017-07-10 17:19:26

标签: sql oracle

我有一张表ABC,其中包含以下记录 -

  INVC_NUM    | LINE_NUMBER  |  ORGANIZATION_ID  | STATUS    |  DATE

  0000034454       1             521                 Validated   09/09/2016 

  0000034454       2             521                 Validated    04/09/2016 

  0000034410       1             521                 Validated    04/09/2016

  0000034410       2             521                 notValidated    04/09/2016

  0000034410       3             521                 notValidated   04/09/2016

  0000034410       4             521                 Validated   04/09/2016

现在我需要更新一个包含以下列的表XYZ

INVC_NUM     |   ORGANIZATION_ID   | date

0000034454   |   521               | 09/09/2016    
0000034410   |   521               | null

每当特定INVC_NUM和organization_id的所有Line_number的状态为" ALL"验证(状态)然后我们需要使用sysdate更新XYZ。

每当特定INVC_NUM和organization_id的所有Line_number的状态都未验证(状态)时,我们需要使用NULL更新XYZ。 XYZ具有每个INVC_NUM和Org_id的唯一记录。

2 个答案:

答案 0 :(得分:1)

您可以使用相关子查询执行此操作。它使用聚合返回一行:

update xyz
    set date = (select (case when count(*) = 0 then sysdate end)
                from abc
                where abc.status = 'NotValidated' and
                      abc.invc_num = xyz.invc_num and
                      abc.organization_id = xyz.organization_id
               );

答案 1 :(得分:1)

为了了解INVC_NUM和organization_id的所有状态是否有效,请查看是否找到了无效状态:

update xyz
set date =
case when not exists
  (
    select *
    from abc
    where abc.invc_num = xyz.invc_num
      and abc.organization_id = xyz.organization_id
      and abc.status = 'notValidated'
  ) then sysdate 
end;

(省略ELSE分支默认为null,这是我们想要的。如果您认为它更具可读性,请将then sysdate end更改为then sysdate else null end。)