我有一张表如下
表1
ID Name Tag
-----------------
1 N1 2.1
2 N2 3.5
3 N1 3.5
4 N3 8.1
我创建了一个带有ID和Name(唯一约束)的新表Table2,我想将Table1的内容插入到Table2中,避免重复,因为我只需要表2中的Table1中的1,2和4。
我试过这个,但似乎没有用,我得到了唯一的约束错误(ORACLE SQL)
INSERT INTO TABLE2 (ID, NAME)
SELECT ID, NAME
FROM TABLE1
WHERE NAME NOT IN (SELECT NAME FROM TABLE2);
请有人指出我正确的方向吗?
很抱歉没有说清楚。表2是一张全新的表格。我希望插入第一个值,应忽略以下重复项。所以在我的情况下,N1,N2被插入,N1被欺骗所以它被忽略,N3被插入
答案 0 :(得分:1)
好的 - 从你的描述中,我理解表t2当前是空的,你想要将id在(1,2,4)中的行从表t1复制到表t2。
为什么你的代码失败了:
您似乎相信条件应用于t1中的第一行,它通过以便将其插入到t2中,然后将条件应用于t1中的第二行(使用已插入到t2中的内容)等 - 并且你不明白为什么有任何尝试将所有行从t1插入t2。为什么第三行没有WHERE子句失败?
好问题!原因是操作是在SET基础上完成的。在INSERT操作开始之前,WHERE条件使用表t2 AS IT WAS。因此对于所有行,WHERE子句与空表t2进行比较。
如何解决此问题...确定存在重复名称时要添加的id
。例如,获得您想要的结果的一种方法是为每个名称选择MIN(id)
。此外,您仍然想检查t2中是否存在该名称(因为您可能在将来再次执行此操作时,t2已经部分填充)。
insert into t2 ( id, name )
select min(id), name
from t1
where name not in (select name from t2)
group by name
;
答案 1 :(得分:0)
你可以尝试一下......!
Insert into tb2(Field1, Field2)
SELECT Field1, Field2
FROM tb1
WHERE NOT EXISTS (SELECT Field1 FROM tb1) ;
答案 2 :(得分:0)
这就是我理解这个问题的方法:
SQL> create table table2
2 (id number,
3 name varchar2(2),
4 tag number,
5 constraint pk_t2 primary key (id, name)
6 );
Table created.
SQL>
SQL> insert into table2 (id, name, tag)
2 with test (id, name, tag) as
3 (select 1, 'N1', 2.1 from dual union
4 select 2, 'N2', 3.5 from dual union
5 select 3, 'N1', 3.5 from dual union
6 select 4, 'N3', 8.1 from dual
7 )
8 select min(id), name, max(tag)
9 from test
10 group by name;
3 rows created.
SQL>
SQL> select * from table2 order by id;
ID NA TAG
---------- -- ----------
1 N1 3,5
2 N2 3,5
4 N3 8,1
SQL>
答案 3 :(得分:0)
尝试检查Table2中的id和名称是否不存在于Table2中,如果然后插入。
如果TABLE2上的唯一约束是复合键,则运行:
INSERT INTO TABLE2 (ID, NAME)
SELECT A.ID, A.NAME
FROM TABLE1 A
WHERE NOT EXISTS (SELECT NULL FROM TABLE2 B WHERE A.ID=B.ID AND A.NAME=B.NAME);
如果有两个独特的约束条件;一个在id上,另一个在名称上然后运行它:
INSERT INTO TABLE2 (ID, NAME)
SELECT A.ID, A.NAME
FROM TABLE1 A
WHERE NOT EXISTS (SELECT NULL FROM TABLE2 B WHERE A.ID=B.ID OR A.NAME=B.NAME);
答案 4 :(得分:0)
ORACLE,以防您需要从2个不同的表中获取值。
在下面的示例中,我使用增量形式。
INSERT INTO TABLE1
(INDEX, REMARKS, NAME, AGE)
(SELECT (SELECT colescs(MAX(INDEX),0) FROM TABLE1)+1,
'any remarks',
t2.NAME, t2,age from TABLE2 t2 where t2.name = 'apple')
说明 匹配以下数字(1)-(1),(2)-(2)...
答案 5 :(得分:-1)
当我们需要将任何两列或更多列唯一时,我们必须创建唯一索引。
运行此查询
ALTER TABLE fdata = open(pathf, "r").read().splitlines()
ADD UNIQUE TABLE2
(unique_index
,id
);
然后 INSERT INTO TABLE2(id,name,tag)VALUES(1," N1",3.5) ON DUPLICATE KEY UPDATE tag = 3.5
这也有助于更新新标签