PostgreSQL对比两张表的差异

对比两张表的差异

create table foo(
    id int primary key,
    name varchar(50)
);

create table bar(
    id int primary key,
    name varchar(50)
);

insert into foo(id,name) values
    (1,'a'),
    (2,'b');
    
insert into bar(id,name) values
    (1,'a'),
    (2,'c');
    
方式一:
使用except查找两张表的差异:数据出现第一个结果集中但不在第二个结果集中的
即:查询出现foo表中,但不出现在bar表中
select id ,name,'not in bar' as note from foo
except
select id,name,'not in bar' as note from bar;

或:'not in bar' as note 只是作为一列用来说明的,可有可无
select id ,name from foo
except
select id,name from bar;
结果:
id     name
2       b


查询出现bar表中,但不出现在foo表中
select id ,name from bar
except
select id,name from foo;
结果:
id     name
2       c



方式二:
使用完全外部连接查询两张表(两张表的列名此例中是一致的,实际中也可以自我决定)的差异:
1、查询两张表中的所有行,同时去重复的行
select id,name from foo full outer join bar using(id,name); 
结果:
id     name
1       a
2       b
2       c



2、因为bar的ID没有null的值,所有过滤条件bar.id is null就相当于排除了bar表的数据;
只显示foo表的数据,且不包括两表都存在的数据
select id,name from foo full outer join bar using(id,name)
    where bar.id is null;
结果:
id     name
2       b
    

3、因为foo的ID没有null的值,所有过滤条件foo.id  is null就相当于排除了foo表的数据;
只显示bar表的数据,且不包括两表都存在的数据
select id,name from foo full outer join bar using(id,name)
    where  foo.id  is null;
结果:
id     name
2       c




4、使用or接连排除掉不在foo表中的数据和不在bar表中的数据,即两表的各自不同的数据都显示出来
select id,name from foo full outer join bar using(id,name)
    where  foo.id  is null or bar.id  is null;
结果:
id     name
2       b
2       c


5、查看两表各自拥有且不同的数据有多少行数据
select count(*) from foo full outer join bar using(id,name)
    where foo.id is null or bar.id is null;
结果:
2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容