Sql Oracle 12c-使用另一个表中的值在表中插入值

Sql Oracle 12c-使用另一个表中的值在表中插入值,sql,oracle,oracle12c,Sql,Oracle,Oracle12c,我有一个表(TABLEA)如下: 还有另一个表(TABLEB)如下所示: TABLEB.TYPE\u ID是FK到TABLEA.TYPE\u ID。目前,我正在手动在表B中输入数据 我在表A中新增了两行。。类型_id 3和4 如何使用表格A自动填充表格B中不存在的数据?我希望自动插入表B中的所有列 如你所见: SEQ_ID将是连续的 当顺序值为1时,名称值将“显示”,而级别将为7 当ORDER值为2时,NAME值将为“header” 当ORDER值为3时,NAME值将为“detail” 我期

我有一个表(
TABLEA
)如下:

还有另一个表(
TABLEB
)如下所示:

TABLEB.TYPE\u ID
是FK到
TABLEA.TYPE\u ID
。目前,我正在手动在
表B
中输入数据

我在
表A中新增了两行。。类型_id 3和4

如何使用
表格A
自动填充
表格B
中不存在的数据?我希望自动插入
表B
中的所有列

如你所见:

  • SEQ_ID
    将是连续的
  • 顺序
    值为1时,
    名称
    值将“显示”,而
    级别
    将为7
  • ORDER
    值为2时,
    NAME
    值将为“header”
  • ORDER
    值为3时,
    NAME
    值将为“detail”
我期待在插入之后:

seq_id type_id  name     order level
1      1        display  1     7
2      1        header   2     
3      1        detail   3     
4      2        display  1     4
5      2        header   2     
6      2        detail   3     
7      3        display  1     2
8      3        header   2     
9      3        detail   3     
10     4        display  1     5
11     4        header   2
12     4        detail   3
感谢您的帮助

您可以:

  • 让您的应用程序代码填充两个表,即:将适当的记录插入到两个表中

  • (听起来你倾向于)让Oracle在幕后完成工作,即:Oracle为你在
    TABLEB
    中插入内容。方法是在
    表a
    上创建触发器。下面是一个可能让您开始学习的示例:


  • 有些人会告诉您,触发器可能会使调试变得困难,因为您的部分逻辑在数据库中。这种批评有些道理。我不会说总是/从不使用触发器。在它们有意义的地方使用它们:它们提供的价值超过其复杂性

    因此这可以在纯SQL:INSERT-ALL中完成,它允许我们在同一条语句中发出多个INSERT

    insert all
        into tableb (seq_id, type_id, name, order_id, level_id) 
            values(tableb_id_seq.nextval, type_id, 'display', 1, level_id)
        into tableb (seq_id, type_id, name, order_id) 
            values(tableb_id_seq.nextval+1, type_id, 'header', 2)
        into tableb (seq_id, type_id, name, order_id) 
            values(tableb_id_seq.nextval+2, type_id, 'detail', 3)
    select a.type_id, a.level_id from tablea a
    minus
    select b.type_id, b.level_id from tableb b
    /
    
    对序列的操作有点滑稽:它是必需的,因为对NEXTVAL的每次调用都会在一条语句中返回相同的值。显然,为了实现这一点,序列需要增加三个:

    create sequence tableb_id_seq increment by 3;
    
    这可能足以排除这种做法。作为替代,您可以使用(SEQ_ID,ORDER_ID)作为复合主键,但这也不好


    顺便说一下,顺序和级别是关键字:不能将它们用作列名

    insert all
        into tableb (seq_id, type_id, name, order_id, level_id) 
            values(tableb_id_seq.nextval, type_id, 'display', 1, level_id)
        into tableb (seq_id, type_id, name, order_id) 
            values(tableb_id_seq.nextval+1, type_id, 'header', 2)
        into tableb (seq_id, type_id, name, order_id) 
            values(tableb_id_seq.nextval+2, type_id, 'detail', 3)
    select a.type_id, a.level_id from tablea a
    minus
    select b.type_id, b.level_id from tableb b
    /
    
    create sequence tableb_id_seq increment by 3;