Oracle:使用非历史记录表

时间:2015-09-10 15:29:55

标签: sql oracle copy

我们有两张桌子

COI_EVENTS
H_COI_EVENTS

相关的唯一列是EVENT_IDTYPE_IDEVENT_ID是PK列,TYPE_ID链接到另一个表(此处不相关)。

COI_EVENTS表包含当前事件数据。每次通过应用程序更新都会将COI_EVENTS数据复制到H_COI_EVENTS以获取历史记录。

与当前事件关联的部分H_COI_EVENTS包含的TYPE_IDCOI_EVENTS中的TYPE_ID不同,这是混乱的数据。

对于COI_EVENTS不匹配的所有历史记录行,我想将H_COI_EVENTSTYPE_ID复制到TYPE_ID。 (也许解决方案甚至可以将非历史记录H_COI_EVENTS复制到update H_COI_EVENTS heo set heo.TYPE_ID = e.TYPE_ID where exists (select e.TYPE_ID from COI_EVENTS e join H_COI_EVENTS he on he.EVENT_ID = e.EVENT_ID where he.TYPE_ID <> e.TYPE_ID); )。

我试过

update H_COI_EVENTS heo
  set heo.TYPE_ID = (select e1.TYPE_ID
                       from COI_EVENTS e1
                       join H_COI_EVENTS he1
                         on heo.EVENT_ID = e1.EVENT_ID
                       where e1.EVENT_ID = heo.EVENT_ID)
  where exists (select e.TYPE_ID
                  from COI_EVENTS e
                  join H_COI_EVENTS he
                    on he.EVENT_ID = e.EVENT_ID
                  where he.TYPE_ID <> e.TYPE_ID);

但这会导致一些语法错误,因为此处不允许使用FROM。再试一次

Fehler beim Start in Zeile 22 in Befehl:
update H_COI_EVENTS heo
set heo.TYPE_ID = ( select e1.TYPE_ID from COI_EVENTS e1 join H_COI_EVENTS he1 on heo.EVENT_ID = e1.EVENT_ID where e1.EVENT_ID = heo.EVENT_ID )
where exists ( select e.TYPE_ID
from COI_EVENTS e
join H_COI_EVENTS he on he.EVENT_ID = e.EVENT_ID
where he.TYPE_ID <> e.TYPE_ID)
Fehlerbericht:
SQL-Fehler: ORA-01407: Aktualisieren von ("ABN_12C"."H_COI_EVENTS"."TYPE_ID") zu NULL nicht möglich
01407. 00000 -  "cannot update (%s) to NULL"
*Cause:    
*Action:

给了我一个错误:

update H_COI_EVENTS heo
set heo.TYPE_ID = ( select ei.TYPE_ID from COI_EVENTS ei where ei.EVENT_ID = heo.EVENT_ID )

更新

将ID简单复制到所有历史记录行的更简单方法是:

Fehler beim Start in Zeile 33 in Befehl:
update H_COI_EVENTS heo
set heo.TYPE_ID = ( select ei.TYPE_ID from COI_EVENTS ei where ei.EVENT_ID = heo.EVENT_ID )
Fehlerbericht:
SQL-Fehler: ORA-01407: Aktualisieren von ("ABN_12C"."H_COI_EVENTS"."TYPE_ID") zu NULL nicht möglich
01407. 00000 -  "cannot update (%s) to NULL"
*Cause:    
*Action:

然而,Oracle窒息:

format

我不明白。

我如何实现我所描述的目标?

0 个答案:

没有答案