【问题标题】:Is there a way to the following with one update in PL/SQL?有没有一种方法可以通过 PL/SQL 中的一次更新来执行以下操作?
【发布时间】:2023-01-30 01:21:12
【问题描述】:

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

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

我们需要为 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 VERSION_NBR NOTIFY_TYPE OPRID
    456 1 A ExistingUser2
    456 1 E ExistingUser2
    456 1 R ExistingUser2
    456 1 E NewUser1
    456 1 R NewUser1
    456 1 E NewUser2
    456 1 R NewUser2
    789 1 A ExistingUser3
    789 1 E ExistingUser3
    789 1 R ExistingUser3
    789 1 E NewUser1
    789 1 R NewUser1
    789 1 E NewUser2
    789 1 R NewUser2
    123 2 A ExistingUser1
    123 2 E ExistingUser1
    123 2 R ExistingUser1
    123 2 E NewUser1
    123 2 R NewUser1
    123 2 E NewUser2
    123 2 R NewUser2

【问题讨论】:

  • 您使用的是 Postgresql 还是 Oracle?

标签: oracle plsql insert


【解决方案1】:

您可以生成:

  • "NOTIFY_TYPE 为“E”和“R”的所有“现有用户#”",在您的 <CNTRCT_ID、VERSION_NBR、OPRID> 组合和您可能的组合之间使用 CROSS JOINNOTIFY_TYPE" 值(E 和 R)
  • "对于每个 CNTRCT_ID,OPRID 为“NewUser1”和“NewUser2” 对于每个 NOTIFY_TYPE 为“E”和“R”的合同",对 [E, R] 中的 NOTIFY_TYPE 和 [NewUser1, NewUser2] 中的 OPRID 使用两个 CROSS JOIN 操作

因此,在您的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 演示 here

【讨论】:

    【解决方案2】:

    如果你的表是这样的:

    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               
    

    ...这是 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)
    

    ..结果:

    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                    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 2015-07-10
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      相关资源
      最近更新 更多