【问题标题】:How to do the mutiple insert into..select query in a single insert statement?如何在单个插入语句中执行多个插入到..select 查询?
【发布时间】:2015-07-17 07:11:26
【问题描述】:

我有多个 insert into..select 语句,如下所示。如果您看到,在所有三个语句中只有一个列值(Req_Attrname)在变化。其他一切都相同,包括where 条件。

插入语句 1)

insert into details(repo_phyid,repo_type,repo_attrname,repo_Attrvalue
                    ,Req_phyid,Req_type,Req_Attrname,Req_attrvalue) 
select demo.phyid,'Complementary Item','Product Management Responsible',demo.attr_value,
                   tnr.phyid,'Complementary Item','**Product Manager**',demo.attr_value
       From repo_Tnr Tnr,repo_Tnr_Attribute demo 
       Where Tnr.Phyid=demo.Phyid 
             And demo.Attr_Name='Product Management Responsible'
             and tnr.type='Complementary Item'

插入语句 2)

insert into details(repo_phyid,repo_type,repo_attrname,repo_Attrvalue,
                     Req_phyid,Req_type,Req_Attrname,Req_attrvalue) 
select demo.phyid,'Complementary Item','Product Management Responsible',demo.attr_value,
                   tnr.phyid,'Complementary Item','**Quality Manager**',demo.attr_value
       From repo_Tnr Tnr,repo_Tnr_Attribute demo 
       Where Tnr.Phyid=demo.Phyid 
             And demo.Attr_Name='Product Management Responsible'
             and tnr.type='Complementary Item'

插入语句 3)

insert into details(repo_phyid,repo_type,repo_attrname,repo_Attrvalue
                    ,Req_phyid,Req_type,Req_Attrname,Req_attrvalue) 
select demo.phyid,'Complementary Item','Product Management Responsible',demo.attr_value
                    ,tnr.phyid,'Complementary Item',**'Depty Engineer**',demo.attr_value
        From repo_Tnr Tnr,repo_Tnr_Attribute demo 
        Where Tnr.Phyid=demo.Phyid 
              And demo.Attr_Name='Product Management Responsible'
              and tnr.type='Complementary Item'

我在这里尝试的是,如果选择返回我 20 行,首先我必须插入 20 行 Product Manager 作为 Req_attrname 的值,然后我必须插入相同的 20 行但 Quality Manager 并再次与Deputy Engineer 。为此,我使用了 3 个插入语句。像这样我有 15 到 20 个插入语句。有没有办法可以在单个插入语句中做到这一点?它将帮助我减少代码并增加可读性。请提供替代解决方案。

【问题讨论】:

    标签: sql oracle oracle11g sql-insert


    【解决方案1】:

    由于Req_Attrname 都是常量,您可以在原始查询中从dualcross join 查询所有这些结果,这样您就可以从查询中获得与每个Req_Attrname 匹配的每一行:

    INSERT INTO details (repo_phyid,
                         repo_type,
                         repo_attrname,
                         repo_attrvalue,
                         req_phyid,
                         req_type,
                         req_attrname,
                         req_attrvalue) 
    SELECT     demo.phyid,
               'Complementary Item',
               'Product Management Responsible',
               demo.attr_value,
               tnr.phyid,
               'Complementary Item',
               req_attrname,
               demo.attr_value
    FROM       repo_tnr tnr
    JOIN       repo_tnr_tttribute demo ON tnr.phyid = demo.phyid
    CROSS JOIN (SELECT '**Product Manager**' AS req_attrname FROM dual
                UNION ALL
                SELECT '**Quality Manager**' AS req_attrname FROM dual
                UNION ALL
                SELECT '**Depty Engineer**'  AS req_attrname FROM dual) t
    WHERE      demo.attr_name = 'Product Management Responsible' AND
               tnr.type = 'Complementary Item'
    

    【讨论】:

    • 谢谢它的工作。 :) 我还有一个疑问。如果这些不是常量,我需要从某个表中选择怎么办?因为我也有那些场景。请帮帮我。
    • @Crazy2crack 你可以只查询那个表而不是dual
    • 就这样?好的,我会试一试。非常感谢..:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多