根据条件更新某一特定用户的所有门票的ALLIANCE_FLG

问题描述 投票:0回答:1

我们有一个需求,需要将oracle数据库中“ALL_TICKETS”表和用户表“ALL_USERS”中属于一个用户的所有机票的ALLIANCE_FLG更新为“Y”。

条件是,如果这些列中的任何一个标志为“Y”,那么我们需要在他所有现有的机票中更新 ALLIANCE_FLG = 'Y'。

以下是一些条件。

  1. 如果客户端级别的 ONEWRLD = 'Y'(在 ALL_USERS 表中)或用户的第一张票上的 ALLIANCE_FLG = 'Y'(ALL_TICKETS 表)或 USR_VIP IS NULL(ALL_TICKETS 表)或 ALLIANCE_FLG = 'N'(ALL_TICKETS 表)用户的第二张票:然后我们需要更新所有用户票上的 ALLIANCE_FLG = 'Y'

  2. 如果客户端级别的 ONEWRLD 为 NULL(在 ALL_USERS 表中)或用户的第一张票上的 ALLIANCE_FLG = 'N'(ALL_TICKETS 表)或 USR_VIP IS NULL(ALL_TICKETS 表)或 ALLIANCE_FLG = 'N'(ALL_TICKETS 表)用户的第二张票:然后我们需要在所有用户的门票上更新 ALLIANCE_FLG = 'N'

  3. 如果客户端级别的 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。

sql oracle plsql cursor
1个回答
0
投票

您可以使用 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    */
© www.soinside.com 2019 - 2024. All rights reserved.