用SQL查询两个表中相同的数据

有两个表,包含相同的字段,也有不同的字段且表2的数据多于表1 ,其中多的部分没有相同的数据,怎样把表1中有表2没有的字段加到表2中呢(数据相同部分),同时也保留表2中多的数据。

1、创建测试表;

create table test_col_1(id number, var varchar2(200));

create table test_col_2(id number, var varchar2(200));

2、插入测试数据,

insert into test_col_1 

select level*8, 'var'||level*8 from dual connect by level <= 20;

insert into test_col_2 

select level, 'var'||level from dual connect by level <= 100;

3、比较两表的数据,可以发现表2的数据多于表1;

select 'test_col_1' tbl_name, count(*) from test_col_1 t

union all

select 'test_col_2' tbl_name, count(*) from test_col_2 t

4、表1有部分比表2多的数据,

select * from test_col_1 

minus

select * from test_col_2;

5、插入表1多的数据,如表2,执行sql,可以发现有多条记录插入。

insert into test_col_2

select * from test_col_1 

minus

select * from test_col_2;

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-07
关键是第一步,你要找出表1中有,而表2中没有的数据行.
select t1.* from 表1 t1
left join 表2 t2 on t1.?=t2.? --以什么列相同判定为有,都在这里做等于
where isnull(t2.?,'noData')='noData' --如果表1有而表2也有的列,为null则说明未匹配上,这个列的值不能为null,可以默认为空,否则无法区为值为NULL或因为匹配不成功为NULL

查出表1中有而表2中没有数据,然后就是你的insert into 表2 select ...的问题了.追问

首先先谢谢你,我没太明白,问题是这样的,我单位代工资,我单位系统里有员工编号,而他们提供的数据不带编号(新增加的更没有了),这样我就得一个一个的对很麻烦,我想把员工编号直接加到他们提供的数据里而不影响他们的数据,谢谢您

追答

他们的数据有员工姓名没有?
我差不多明白你的意思了,是表2中想要增加一个列,这个列需要从表1去取?

追问

是这样的

追答

update 表2 set 员工编号=t1.员工编号
from 表2 t2 left join 表1 t1 on t2.员工姓名=t1.员工姓名
where isnull(t2.员工编号,'')=''

本回答被提问者采纳
第2个回答  2012-01-05
insert into 表2 (select 表1和表2都包含的字段 from 表1) 就可以了
第3个回答  2012-01-05
insert into 表2
select * from 表1 except select * from 表2
相似回答