sql - 如何在单个插入语句中执行多个 insert into..select 查询?

标签 sql oracle oracle11g sql-insert

我有多个 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 行,但是与质量经理 合作,并再次与副工程师 合作。为了实现这一点,我使用了 3 个插入语句。像这样我有 15 到 20 个插入语句。有没有一种方法可以在单个插入语句中做到这一点?它将帮助我减少代码并增加可读性。请提供替代解决方案。

最佳答案

由于 Req_Attrname 都是常量,因此您可以从 dual 查询所有这些内容,并在原始查询上交叉连接此结果,以便您获取查询中的每一行与每个 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'

关于sql - 如何在单个插入语句中执行多个 insert into..select 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31470243/

相关文章:

sql - 查找包含 X 列和 X_FOO 列的表

sql - 累积决策 Oracle SQL

php - 应用 GROUP BY ID 时 SUM 添加不正确

SQLite JOIN WHERE 不在多个表中

php - SQL 查询结果为字符串(或变量)

sql - 仅针对特定记录按子句分组

sql - 动态 SQL 或 WITH 子句

SQL:减少结果集的大小

oracle - Oracle 中的 Pragma Inline 与 Pinning 对象

sql - 如何为所有行更新表中特定字段的值?