繁体   English   中英

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

[英]Oracle 12c - Insert values in a table using values from another table

我有一个表( TABLEA )像这样:

type_id  level
1        7
2        4
3        2
4        5

另一个表( TABLEB )像这样:

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     

TABLEB.TYPE_ID是FK到TABLEA.TYPE_ID 目前,我正在手动在TABLEB输入数据。

我在TABLEA有2个新行.. type_id 3和4。

如何使用TABLEA自动填充TABLEB不存在的数据? 我希望TABLEB所有列都可以自动插入。

因此,如您所见:

  • SEQ_ID将是顺序的
  • ORDER值为1时, NAME值为“ display”,而LEVEL则为7
  • ORDER值为2时, NAME值为“ header”
  • ORDER值为3时, NAME值为“详细信息”

我期望插入后:

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

任何帮助表示赞赏!

您可以:

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

  2. (听起来像您倾向于的那样)让Oracle在后台进行工作,即:Oracle为您在TABLEB中执行INSERT。 做到这一点的方法是在TABLEA上创建一个TRIGGER。 这是一个可能使您入门的示例: https : //stackoverflow.com/a/13356277/1680777

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

因此,这可以在纯SQL中完成:INSERT ALL,它使我们可以在同一条语句中发出多个插入。

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)作为复合主键,但这也不好。


顺便说一下,ORDER和LEVEL是关键字:您不能将它们用作列名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM