繁体   English   中英

有没有一种方法可以通过 PL/SQL 中的一次更新来执行以下操作?

[英]Is there a way to the following with one update in PL/SQL?

这是我们现在在表 (CNTRCT_NTFYUSER) 中的内容:

CNTRCT_ID 版本_NBR NOTIFY_TYPE OPRID
456 1个 一种 现有用户2
789 1个 一种 现有用户3
123 2个 一种 现有用户1

我们需要为 NOTIFY_TYPE 为“E”和“R”的所有 CNTRCT_ID 插入一些额外的行。

  1. 为所有 NOTIFY_TYPE 为“E”和“R”的“ExistingUser#”插入 2 行
  2. 为每个 CNTRCT_ID 插入 2 个额外的行,每个 CNTRCT_ID 的 OPRID 为“NewUser1”和“NewUser2”,每个合同的 NOTIFY_TYPE 为“E”和“R”。
CNTRCT_ID 版本_NBR NOTIFY_TYPE OPRID
456 1个 一种 现有用户2
456 1个 现有用户2
456 1个 R 现有用户2
456 1个 新用户1
456 1个 R 新用户1
456 1个 新用户2
456 1个 R 新用户2
789 1个 一种 现有用户3
789 1个 现有用户3
789 1个 R 现有用户3
789 1个 新用户1
789 1个 R 新用户1
789 1个 新用户2
789 1个 R 新用户2
123 2个 一种 现有用户1
123 2个 现有用户1
123 2个 R 现有用户1
123 2个 新用户1
123 2个 R 新用户1
123 2个 新用户2
123 2个 R 新用户2

您可以生成:

  • all 'ExistingUser#' with NOTIFY_TYPE of 'E' and 'R' ”,在您的 <CNTRCT_ID, VERSION_NBR, OPRID> 组合和您可能的“ NOTIFY_TYPE ”值(E 和 R)之间使用CROSS JOIN
  • 对于每个具有'NewUser1'和'NewUser2'的OPRID的CNTRCT_ID对于具有'E'和'R'的NOTIFY_TYPE的每个合同“,在[E,R]中的NOTIFY_TYPE和[NewUser1中的OPRID上使用两个CROSS JOIN操作,新用户2]

因此,在SELECT语句之前使用INSERT语句。

INSERT INTO CNTRCT_NTFYUSER

SELECT CNTRCT_ID, VERSION_NBR, nt.NOTIFY_TYPE, OPRID
FROM CNTRCT_NTFYUSER
CROSS JOIN (SELECT 'E' AS NOTIFY_TYPE FROM DUAL UNION ALL SELECT 'R' FROM DUAL) nt

UNION ALL

SELECT CNTRCT_ID, VERSION_NBR, nt.NOTIFY_TYPE, oid.OPRID
FROM CNTRCT_NTFYUSER
CROSS JOIN (SELECT 'E' AS NOTIFY_TYPE FROM DUAL UNION ALL SELECT 'R' FROM DUAL) nt
CROSS JOIN (SELECT 'NewUser1' AS OPRID FROM DUAL UNION ALL SELECT 'NewUser2' FROM DUAL) oid;

此处查看 Oracle 演示。

试试这个 INSERT 语句:

INSERT INTO CNTRCT_NTFYUSER
Select      c1.CNTRCT_ID, c1.VERSION_NBR, x.NOTIFY_TYPE, x.OPRID
From        CNTRCT_NTFYUSER c1
Inner Join  (  SELECT er.NOTIFY_TYPE, usr.OPRID 
               FROM ( (Select 'E' "NOTIFY_TYPE" From Dual UNION ALL Select 'R' "NOTIFY_TYPE" From Dual) er
                      Inner Join (Select 'NewUser1' "OPRID" From Dual UNION ALL Select 'NewUser2' From Dual) usr ON(1 = 1)
                    )
            ) x ON(1 = 1)

The Inner 加入查询结果的地方

SELECT er.NOTIFY_TYPE, usr.OPRID 
               FROM ( (Select 'E' "NOTIFY_TYPE" From Dual UNION ALL Select 'R' "NOTIFY_TYPE" From Dual) er
                      Inner Join (Select 'NewUser1' "OPRID" From Dual UNION ALL Select 'NewUser2' From Dual) usr ON(1 = 1)
                    )

NOTIFY_TYPE OPRID  
----------- --------
E           NewUser1 
E           NewUser2 
R           NewUser1 
R           NewUser2

...包含新类型和新用户。

因此,使用您的初始数据如下:

Select * From CNTRCT_NTFYUSER ORDER BY CNTRCT_ID, VERSION_NBR, NOTIFY_TYPE

 CNTRCT_ID VERSION_NBR NOTIFY_TYPE                    OPRID                        
---------- ----------- ------------------------------ ------------------------------
       123           2 A                              ExistingUser1                  
       456           1 A                              ExistingUser2                  
       789           1 A                              ExistingUser3               

...结果将是:

Select * From CNTRCT_NTFYUSER ORDER BY CNTRCT_ID, VERSION_NBR, NOTIFY_TYPE

 CNTRCT_ID VERSION_NBR NOTIFY_TYPE                    OPRID                        
---------- ----------- ------------------------------ ------------------------------
       123           2 A                              ExistingUser1                  
       123           2 E                              NewUser1                       
       123           2 E                              NewUser2                       
       123           2 R                              NewUser1                       
       123           2 R                              NewUser2                       
       456           1 A                              ExistingUser2                  
       456           1 E                              NewUser1                       
       456           1 E                              NewUser2                       
       456           1 R                              NewUser1                       
       456           1 R                              NewUser2                       
       789           1 A                              ExistingUser3                  
       789           1 E                              NewUser2                       
       789           1 E                              NewUser1                       
       789           1 R                              NewUser1                       
       789           1 R                              NewUser2                    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM