0

我有两个表:table_1 和 table_2。在这些表中有两列:p_code (varchar2) 和 o_code (varchar2),它们都是主键。所以我们有:

table_1.p_code,
table_1.o_code,
table_2.p_code,
table_2.o_code

我想将 table_2 复制到 table_1 中,但 table_1 中可能已经存在一些相同的行。我以为我可以用函数或过程来处理这种情况,但我做不到。我该如何处理?

顺便说一句:两个示例表和列:

Table_1:
P_code    O_code
C123      PREP100
C123      PREP101

Table_2:
P_code    O_code
C123      PREP101
C123      PREP102

我想将 table_2 插入 Table_1 但 C123 PREP 已存在于 Table_1 中。我想我可以将最后三个字符分开,变成数字,增加一个,变成 varchar2,看看 table_1 中是否存在。但我无法为它编写sql过程或函数......

4

2 回答 2

0

这应该适用于大多数 SQL 引擎(Oracle 11G 的 SQLFiddle 演示):

INSERT INTO table_1 (p_code, o_code)
SELECT p_code, o_code FROM table_2
MINUS
SELECT p_code, o_code FROM table_1

通过您的示例,我假设您的主键是(p_code, o_code).

更新:SQL92 有标准EXCEPT运算符,但 Oracle 不支持。相反,它使用MINUS,其工作原理完全相同。

于 2013-06-07T06:57:12.850 回答
0

你可以使用类似的东西:

insert into table_1 (p_code, o_code)
(-- add all rows in table_2 that are not present in table_1
 (select t2.p_code, t2.o_code from table_2 t2 
 minus
 select t1.p_code, t1.o_code from table_1 t1)
 union all
 -- add all rows in table_2 that are present in table_1
 (select t2.p_code, t2.o_code || '_2' from table_2 t2
  join table_1 t1a on t2.p_code = t1a.p_code and t2.o_code = t1a.o_code)
);

这将插入未更改的新行,并以 _2 为现有行添加后缀;然后,您可以轻松地在之后运行 UPDATE 语句以生成唯一 ID,或者(最好)首先使用序列来生成新 ID。

于 2013-06-07T10:33:55.327 回答