【问题标题】:SQL or procedure to conditionally insert or update in Oracle database在 Oracle 数据库中有条件地插入或更新的 SQL 或过程
【发布时间】:2018-04-27 18:57:54
【问题描述】:

我在 SQL 和过程方面没有太多的实践经验。我需要一个迁移脚本,其中我需要根据其他两个表中的数据更新或插入一个表。

组织:
id   名称  pid
1 org1  null
2 org2  null
3 org3  1
4 org4  2

Org_Channel:
org_id   channel
1         CH_100
2 CH_101

Organization 表具有父子自引用关系。 (pid null 在父母的情况下)。 Org_Channel 组织的映射表。

现在我有了第三张表Org_Settings,我需要根据上面两张表来迁移数据。这里的每条记录都表示一个组织 ID、一个以频道名称为前缀的设置名称(对于子 org.this 将是父 org.channel)和一个标志。我需要一个迁移 SQL 脚本/程序,以便为 每个组织 启用设置 Sign_On 作为 'Y'

当前表是这样的:

Org_Settings:
org_id   s_name             已启用
1 CH_100_Sign_On    N
1       CH_100_X_O         
4       CH_101_Sign_On   


现在 Org_Settings 可能包含也可能不包含每个组织的条目。我还需要进行迁移,如果 Sign_On 存在条目,则需要更新 enabled = Y。这样的结果将是:

Org_Settings:
org_id   s_name             已启用
1 CH_100_Sign_On    
2       CH_101_Sign_On    
3       CH_100_Sign_On    
4       CH_101_Sign_On    


我可以想到这样的伪代码:

for i in each org
    var pid = getPid(i)
    var id = (null == pid) ? i : pid
    var channel = getChannel(id);
    var sname = channel + "_Sign_On"
    if(settingsEntryExists(i, sname))
        updateSettingsEnable(i, sname, 'Y')
    else
        insertSettings(i, sname, 'Y')

【问题讨论】:

    标签: sql oracle stored-procedures database-migration sql-scripts


    【解决方案1】:

    试试这个MERGE INTO 声明。我不明白如果条目存在则更新为“Y”以及如果条目不存在则插入“Y”背后的逻辑。不是和简单的插入一样吗?还是我错过了什么? .如果缺少一些信息来澄清我上面的问题,您可以稍微调整此查询。

    SQLFiddle

    MERGE 
    INTO    Org_Settings d 
    USING   ( select 
                    org.id org_id, 
                    ch.channel|| 
                    '_Sign_On' s_name , 
                    'Y'        enabled 
            FROM 
                    Organization org
            JOIN    Org_Channel  ch ON NVL(org.pid,id) = ch.org_id
            )s 
    ON ( d.org_id  = s.org_id 
                    AND d.s_name = s.s_name )
    WHEN MATCHED THEN 
    UPDATE SET d.enabled = 'Y' 
    WHEN NOT MATCHED THEN 
    INSERT
            (org_id,s_name,enabled 
            ) VALUES 
            (s.org_id,s.s_name,s.enabled 
            );
    

    【讨论】:

    • 感谢您的回答。它解决了我的问题。感谢您花时间在 SQLFiddle 中提供它..
    • 更新而不只是插入的原因是已经有记录与 org. 的设置名称相同,启用值为“N”
    猜你喜欢
    • 2012-02-12
    • 2021-02-26
    • 2019-04-19
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多