将数据从另一个表中插入一个表中,避免重复

时间:2018-02-27 18:19:14

标签: oracle

我有一张表如下

表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被插入

6 个答案:

答案 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)...

  • 插入表1
  • (INDEX,//索引增量(1)
  • REMARKS,//硬代码(2)
  • NAME,//来自表2(3)
  • AGE)//来自表2(4)
  • (SELECT //这部分是从另一个表中获取值
  • (从表1选择SELECT colescs(MAX(INDEX),0))+ 1,//递增(1)
  • “任何说明”,//硬编码值(2)
  • t2.NAME,//来自table2(3)
  • t2,age //来自table2(4)
  • 来自TABLE2 t2,其中t2.name ='apple')// table2的条件

答案 5 :(得分:-1)

当我们需要将任何两列或更多列唯一时,我们必须创建唯一索引。

运行此查询

ALTER TABLE fdata = open(pathf, "r").read().splitlines() ADD UNIQUE TABLE2unique_indexid);

然后 INSERT INTO TABLE2(id,name,tag)VALUES(1," N1",3.5) ON DUPLICATE KEY UPDATE tag = 3.5

这也有助于更新新标签