【问题标题】:How to insert multiple values in table using subquery in Oracle?如何在 Oracle 中使用子查询在表中插入多个值?
【发布时间】:2021-04-07 04:23:56
【问题描述】:

我创建了两个新表TYPEOPERATION-

TYPE 表有以下列

TYPE
(TYPE_ID : integer, with sequence
TYPE_NAME : String
BASE_ID : 
)

TYPE_NAME 的默认值为 (Type1, Type2, Unknown),需要为 BASE 表中的每个 BASE_ID 添加 68 行 所以TYPE表中的每个BASE_ID需要有3个条目

OPERATION 表有以下列

OPERATION
(OPERATION_ID : integer, with sequence
OPERATION_NAME : String
BASE_ID : 
)

OPERATION_NAME 的默认值为(Operation1, Operation2, Unknown),需要为BASE_ID 中的每个BASE_ID 添加它,这是BASE 表中的68 行 所以OPERATION表中的每个BASE_ID需要有3个条目

谁能帮我查询一下,以便我可以轻松地执行这个多次输入的过程。

提前谢谢你。

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:

    必须像这样单独添加查询

    INSERT INTO TYPE(TYPE_ID, TYPE_NAME, BASE_ID) (
    select TYPE_SEQ.nextval, 'Type 1', ID_BASE FROM BASE);
    
    INSERT INTO TYPE(TYPE_ID, TYPE_NAME, BASE_ID) (
    select TYPE_SEQ.nextval, 'Type 2', ID_BASE FROM BASE);
    
    INSERT INTO TYPE(TYPE_ID, TYPE_NAME, BASE_ID) (
    select TYPE_SEQ.nextval, 'Unknown', ID_BASE FROM BASE);
    

    【讨论】:

      【解决方案2】:

      使用交叉连接的 CTE 可能会有所帮助。方法如下。

      先创建表和序列;我的 base 表仅包含 3 行(与您的 68 行相反;只是为了简单起见。您不必创建 base 表,因为您已经拥有它):

      SQL> create table base as
        2    select 1 base_id from dual union all
        3    select 2 base_id from dual union all
        4    select 3 base_id from dual;
      
      Table created.
      
      SQL> create sequence seqankit;
      
      Sequence created.
      
      SQL> create table type (type_id number, type_name varchar2(20), base_id number);
      
      Table created.
      
      SQL> create table operation (operation_id number, operation_name varchar2(20), base_id number);
      
      Table created.
      
      SQL>
      

      插入typeoperation 表:

      SQL> insert into type (type_id, type_name, base_id)
        2  with names (type_name) as
        3    (select 'type1' from dual union all
        4     select 'type2' from dual union all
        5     select 'unknown' from dual
        6    )
        7  select seqankit.nextval, n.type_name, b.base_id
        8  from names n cross join base b;
      
      9 rows created.
      
      SQL> insert into operation (operation_id, operation_name, base_id)
        2  with names (operation_name) as
        3    (select 'operation1' from dual union all
        4     select 'operation2' from dual union all
        5     select 'unknown'    from dual
        6    )
        7  select seqankit.nextval, n.operation_name, b.base_id
        8  from names n cross join base b;
      
      9 rows created.
      
      SQL>
      

      结果如何?

      SQL> select * from type order by base_id, type_name;
      
         TYPE_ID TYPE_NAME               BASE_ID
      ---------- -------------------- ----------
               1 type1                         1
               4 type2                         1
               7 unknown                       1
               2 type1                         2
               5 type2                         2
               8 unknown                       2
               3 type1                         3
               6 type2                         3
               9 unknown                       3
      
      9 rows selected.
      
      SQL> select * from operation order by base_id, operation_name;
      
      OPERATION_ID OPERATION_NAME          BASE_ID
      ------------ -------------------- ----------
                10 operation1                    1
                13 operation2                    1
                16 unknown                       1
                11 operation1                    2
                14 operation2                    2
                17 unknown                       2
                12 operation1                    3
                15 operation2                    3
                18 unknown                       3
      
      9 rows selected.
      
      SQL>
      

      我觉得不错。

      【讨论】:

        【解决方案3】:

        您可以创建一个触发器来插入 TYPE_ID 列的值。

        create trigger TYPE_INS
        before insert on TYPE
        for each row
        when (new.TYPE_ID is null)
        begin
          :new.TYPE_ID := TYPE_SEQ.nextval;
        end;
        

        那么你就不需要 INSERT 语句中的 TYPE_ID 列了,它可以让你做...

        insert into TYPE (TYPE_NAME, BASE_ID)
        select 'Type1', BASE_ID
          from BASE
        union
        select 'Type2', BASE_ID
          from BASE
        union
        select 'Unknown', BASE_ID
          from BASE
        

        【讨论】:

        • 我正在尝试执行它,但我在 Oracle 错误报告中收到以下错误 - SQL 错误:ORA-02287:此处不允许序列号 02287。00000 -“此处不允许序列号” *原因: 指定的序列号(CURRVAL 或 NEXTVAL)在此语句中不合适。 *操作:删除序列号。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-04
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-22
        相关资源
        最近更新 更多