我有一张表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的唯一记录。
答案 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
。)