我有两个表: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,但Table_1中已存在C123 PREP。我以为我可以把最后三个字符拼写,trun到数字,增加一个,变成varchar2,看看是否存在于table_1中。但是我无法为它编写sql过程或函数......
答案 0 :(得分:0)
这应该适用于大多数SQL引擎(SQLFiddle Demo for Oracle 11G):
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
,它的工作方式完全相同。
答案 1 :(得分: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。