在Oracle数据库中有条件地插入或更新的SQL或过程

在Oracle数据库中有条件地插入或更新的SQL或过程,sql,oracle,stored-procedures,database-migration,sql-scripts,Sql,Oracle,Stored Procedures,Database Migration,Sql Scripts,我对SQL和过程没有太多的实践经验。我需要一个迁移脚本,其中我需要根据其他两个表中的数据更新或插入一个表 组织:id名称PID 1 org1null 2 org2null 3 ORG314 org42 组织渠道:组织id渠道1通道100 2 丘101 组织表具有父子自引用关系。如果是父项,则为pid null。Org_Channel是仅针对父组织的映射表 现在我有了第三个表Org_Settings,在其中我需要基于上述两个表迁移数据。此处的每条记录表示一个组织id、一个设置名称(以子组织的频道名

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

组织:id名称PID 1 org1null 2 org2null 3 ORG314 org42

组织渠道:组织id渠道1通道100 2 丘101

组织表具有父子自引用关系。如果是父项,则为pid null。Org_Channel是仅针对父组织的映射表

现在我有了第三个表Org_Settings,在其中我需要基于上述两个表迁移数据。此处的每条记录表示一个组织id、一个设置名称(以子组织的频道名称为前缀)。这将是父组织频道和一个标志。我需要一个迁移SQL脚本/过程,以便为每个组织启用设置登录为“Y” 当前表如下所示:

组织设置:组织id s\U名称已启用1个Chu 100签名1个Chu 100签名 4 Chu_101_Sign_OnY

现在,组织设置可能包含也可能不包含每个组织的条目。此外,我还需要迁移,这样,如果存在登录项,则需要更新enabled=Y。这样,结果将是:

组织设置:组织id s\U名称已启用1 Chu 100\u Sign OnY 2 Chu 101\u Sign OnY 3千禧100千禧4千禧101千禧

我可以想到以下伪代码:

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')
试试这个MERGE-INTO语句。我不理解在条目存在时更新为“Y”以及在条目不存在时插入“Y”背后的逻辑。这和简单的插入不一样吗?。还是我遗漏了什么。你可以稍微调整这个查询,如果有一些遗漏的信息来澄清我上面的问题


谢谢你的回答。它解决了我的问题。感谢您抽出时间在SQLFiddle中提供它。更新而不仅仅是插入的原因是因为已经有记录具有与组织相同的设置名称。启用值为“N”
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 
        );