SQL根据一个字段

时间:2017-01-10 23:23:57

标签: sql oracle sql-update

我有一组数据示例:

seq  id    status in_process processed 
3    A     N      T          F

这是我按计划使用的临时表的模型。它相当复杂,但我希望这足以说明问题。

此记录的处理每15分钟进行一次。对于给定的“id”,记录按seq从最低到最高的顺序处理。如果status ='N'(新),则将处理记录。如果在运行时遇到上述记录,则会处理和处理的id数据将更新为“T”

稍后如果遇到以下情况......

seq  id    status in_process processed
5    A     D      T          F 

将处理ID并将目的地通知新状态='D'(已删除),处理后将更新为'T'

但如果相反,则在运行之间发生以下情况:

seq  id    status in_process processed
5    A     D      T          F 
3    A     N      T          F

我希望不进行任何处理,只需将处理更新为“T”

鉴于上一个场景,我可以使用哪种更新查询?我想基本上说

update myTable set processed = 'T' where {processed = 'F' and status was N and is now D for a given id}

这是花括号中的最后一部分,我不知道如何写。由于在D状态之后相同的id将不具有N的状态,所以我不需要引用seq值,只要status ='N'并且处理='F'用于相同的id我计划更新。更多示例,在下面的示例中,我想要更新ID A和D1而不进行处理,并将B和C记录单独保留更新。

seq  id    status in_process processed
8    D1    D      T          F
7    D1    N      T          F
6    C     D      T          F
5    A     D      T          F 
4    B     N      T          F
3    A     N      T          F

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

一种方法可能是使用display:none - 触发器,它控制是否应插入新记录或更新现有记录。

作为INSTEAD OF INSERT - Oracle中的触发器只能为视图(而不是表)定义,因此必须执行以下操作:

  1. 将您的表重命名为INSTEAD OF INSERT并创建一个视图staging_data, 例如为staging。 因此,您的应用程序将插入到视图中 将触发您的特定代码。

  2. 在触发器代码中,使用create view staging as (select * from staging_data) - 属性和:new - 语句     在基础数据表select上标识是否     更新或插入应该执行。

  3. 最后,执行插入或更新。

  4. 不幸的是,我没有一个写入触发器的环境并试一试;希望它有所帮助。例如,提供回复Oracle view not updatable, advice on Instead Of triggers或咨询谷歌。