相关文章推荐
性感的青椒  ·  Integrating concept ...·  1 年前    · 
失恋的马铃薯  ·  python - Django 3.1 ...·  1 年前    · 
成熟的小狗  ·  Amazon.com·  1 年前    · 

一、问题背景

当您有两个表(或 SELECT 语句的结果集)要进行比较,以查看任何列中的任何更改,以及查看 一个表中存在哪些行在另一个表中不存在时,我发现 UNION 运算符工作得很好。

二、思想与限制

基本思想 :如果我们对两个表所有列的并集进行 GROUP,那么如果这两个表相同,所有分组的 COUNT(*) 必须等于 2。但是对于在任何列上不完全匹配的任何行执行GROUP BY 的COUNT(*) 将会是 1,而这些正好我们想要的。当然我们还可以在 UNION 的每个部分添加一列来指示每行来自哪个表,否则无法区分哪行来自哪个表。

限制要求 :两个表的表结构一致,且主键字段相同;或者两个select结果集结构是一样的;

三、模拟示例

下面以PostgreSQL数据库为例

1、第一个表

CREATE TABLE "public"."HI_citys" (
"id" int8 NOT NULL,
"status" int4,
"fcname" text COLLATE "default",
"shape" text COLLATE "default",
"parent" int8,
"create_time" timestamp(6),
"modify_time" timestamp(6),
PRIMARY KEY ("id")

2、 第二个表

CREATE TABLE "public"."TA_citys" (
"id" int8 NOT NULL,
"status" int4,
"cname" text COLLATE "default",
"shape" text COLLATE "default",
"parent" int8,
"create_time" timestamp(6),
"modify_time" timestamp(6),
PRIMARY KEY ("id")

3、 比较SQL

select min(table_name),id,status,cname,shape,parent,create_time,modify_time from 
    select 'HI_citys' as table_name,id,status,cname,shape,parent,create_time,modify_time from "HI_citys"
    UNION ALL
    select 'TA_citys' as table_name,id,status,cname,shape,parent,create_time,modify_time from "TA_citys"
) tmp
group by id,status,cname,shape,parent,create_time,modify_time
HAVING COUNT(*) = 1
ORDER BY id
第一个括号中用Union语句合并两个中的行记录:仅包含需要比较的列。返回结果集用于比较。 在Group By后边跟上需要进行比对的字段(两个都有的) 如上图pk 和c1是t1和t2 这个宝石Ruby提供了一个pgdiff脚本,该脚本比较两个PostgreSQL数据库并生成SQL语句以使它们的结构相同。 原始版本发布在 。 该脚本检测以下方面的差异: * Domains * Schemas * Tables * Table field order * Sequences * Views * Constraints * Indices * Functions * Triggers * Rules 如果两个具有相同名称的对象具有相同的定义,则认为它们相等。 pgdiff当前不比较所有权,用户权限,对象依赖性,继承,类型转换,聚合或运算符。 欢迎修补程序添加此功能。 使用Ruby Gems安装pgdiff: gem install "pgdiff" 要使用pgdiff,请打开命令提示符并运行以下命令: pg_diff " 背景:有一张总,多张其他,筛选出主中有其他中没有的数据 1、 在 总中添加一个标记字段 biaoji 2、 用 inner jion 内连接两个 找出两个交叉的数据 SELECT a.* from a INNER JOIN b on a.id = b.id 注意:查询的只能是单数据,才可以修改数据,所以用 a.* 。如果用 * 查询出的是只读数据。 a要有主键,目的是能够让Navicat工具找到该条修改数据 3、 添加标记字段数据 4、 用 标记字段 is null 来筛选差异数 今天接到一个任务,测试库和开发库不同步,领导让对比2个库的差异,对比原则名、字段名、字段属性、字段长度、是否为空,刚接手任务,通过查询USER_TAB_COLUMNS查询出测试库的字段属性,之后在开发库新建一个,把数据导入,之后通过为左右连接为null判断是否存在,一查右4000来条数据,之后要一条一条的比较,这根本就做不了,之后想到了写程序达到效果,思路: demo路径:http:/ PLSQL Developer Tools菜单下有Compare User Objects和Compare Table Data功能。 1、Tools --> compare user objects      该功能用于比较不同用户所拥有的对象(包括table、sequence、function、procedure、view等),并生成同步差异sql脚本,用户通过执行该脚本,可保持两个