我们有一个需求,需要将oracle数据库中“ALL_TICKETS”表和用户表“ALL_USERS”中属于一个用户的所有机票的ALLIANCE_FLG更新为“Y”。
条件是,如果这些列中的任何一个标志为“Y”,那么我们需要在他所有现有的机票中更新 ALLIANCE_FLG = 'Y'。
以下是一些条件。
如果客户端级别的 ONEWRLD = 'Y'(在 ALL_USERS 表中)或用户的第一张票上的 ALLIANCE_FLG = 'Y'(ALL_TICKETS 表)或 USR_VIP IS NULL(ALL_TICKETS 表)或 ALLIANCE_FLG = 'N'(ALL_TICKETS 表)用户的第二张票:然后我们需要更新所有用户票上的 ALLIANCE_FLG = 'Y'
如果客户端级别的 ONEWRLD 为 NULL(在 ALL_USERS 表中)或用户的第一张票上的 ALLIANCE_FLG = 'N'(ALL_TICKETS 表)或 USR_VIP IS NULL(ALL_TICKETS 表)或 ALLIANCE_FLG = 'N'(ALL_TICKETS 表)用户的第二张票:然后我们需要在所有用户的门票上更新 ALLIANCE_FLG = 'N'
如果客户端级别的 ONEWRLD 为 NULL(在 ALL_USERS 表中)或用户的第一张票证上的 ALLIANCE_FLG = 'N'(ALL_TICKETS 表)或用户的第二张票证上的 ALLIANCE_FLG = 'N'(ALL_TICKETS 表)或 ALLIANCE_FLG = 'Y'(用户的第三张票上的 ALL_TICKETS 表)或 USR_VIP IS NULL(ALL_TICKETS 表):然后我们需要更新用户所有票上的 ALLIANCE_FLG = 'Y'
下面是我使用的架构详细信息和更新语句,它抛出错误。下面是 SQL 小提琴。
http://sqlfiddle.com/#!4/7f91c/2
此外,“ALL_TICKETS”表和“ALL_USERS”有数百万条记录。那么,是否存在使用批量收集更新来遍历数百万条记录并相应更新 FLAG 的最佳查询/脚本?
根据条件更新某一特定用户的所有门票的 ALLIANCE_FLG。
您可以使用 MERGE INTO :
MERGE INTO ALL_TICKETS t
USING ( Select at.*, au.ONEWRLD
From ALL_TICKETS at
Inner Join ALL_USERS au ON(SubStr(au.ROW_ID, 1, Length(au.ROW_ID) - 1) = at.USR_ROW_ID)
Where at.ALLIANCE_FLG = 'Y' OR au.ONEWRLD = 'Y' OR at.USR_VIP = 'Y'
) x ON(x.ROW_ID = t.ROW_ID)
WHEN MATCHED THEN UPDATE
SET t.ALLIANCE_FLG = 'Y'
5 rows updated.
SELECT * FROM ALL_TICKETS
/*
ROW_ID TICKET_NUM ALLIANCE_F USR_VIP USR_ROW_ID
---------- -------------- ---------- ---------- ----------
1-3EWR TBYJUY Y Y 1-4TF
1-54TR GVDYRT Y 1-4TF
1-GDV MTMBZA Y N 1-4TF
1-HYJB VSKPSLO Y Y 1-4TF
1-NGPJ LTTCSTM Y N 1-L3EF
1-HYBM VSKPSLO 1-L3EF */