本文整理自网络,侵删。
目录
- 表-表比较
- 整体思路
- 找出不同字段的明细
- T1/T2两表ID相同的部分,是否存在不同NAME
- 两表的交集与差集:判断两表某些字段是否相同
- 两表的交集与差集:找出T2表独有的id
- 字段-字段比较
- 判断两个字段间一对多或多对一的关系
- 证明id字段不是主键
- 证明id, name字段不是联合主键
- 数据准备
- 总结
表-表比较
整体思路
- 两张表条数一样
- 条数相同是前提,然后比较字段值才有意义
- 两表字段值完全相同【两表所有字段的值相同】
- 两表所有字段union后,条数与另一张表条数一样
- 两表字段值部分相同【两表部分字段的值相同】
- 原理:union有去重功能
- 两表部分字段union后,条数与另一张的count(distinct 部分字段)一样
- 找出不同字段的明细
找出不同字段的明细
T1/T2两表ID相同的部分,是否存在不同NAME
SELECT T1.ID,T2.ID,T1.`NAME`,T2.`NAME` FROM A T1 LEFT JOIN B T2 ON T1.ID = T2.ID AND COALESCE(T1.ID,'') <> '' AND COALESCE(T2.ID,'') <> '' WHERE T1.`NAME` <> T2.`NAME`;
两表的交集与差集:判断两表某些字段是否相同
判断两表某些字段是否相同,3种查询结果相同
-- 写法01 SELECT COUNT(1) FROM ( SELECT DISTINCT ID,`NAME` FROM A ) T1; -- 写法02 SELECT COUNT(1) FROM ( SELECT DISTINCT ID,`NAME` FROM B ) T2; -- 写法03 SELECT COUNT(1) FROM ( SELECT DISTINCT ID,`NAME` FROM A UNION SELECT DISTINCT ID,`NAME` FROM B ) T0;
not in与exists
两表的交集与差集:找出T2表独有的id
找出只存在于T2,不在T1中的那些id
- 下面2种写法结果一样
-- 写法01 SELECT T2.`NAME`,T2.* FROM A T2 WHERE T2.`NAME` IS NOT NULL AND NOT EXISTS (SELECT 1 FROM B T1 WHERE T1.ID = T2.ID); -- 写法02 SELECT T2.`NAME`,T2.* FROM A T2 WHERE T2.`NAME` IS NOT NULL AND T2.ID NOT IN (SELECT T1.ID FROM B T1 );
字段-字段比较
判断两个字段间一对多或多对一的关系
测试id与name的一对多关系以下SQL会报错,报错原因 GROUP BY
SELECT ID,`NAME`,COUNT(*) FROM A GROUP BY ID HAVING COUNT(`NAME`)>1;
修改后:
SELECT ID, COUNT(DISTINCT `NAME`) FROM A GROUP BY ID HAVING COUNT(DISTINCT `NAME`)>1;
这样就说明id与name是一对多的关系
相关阅读 >>
系统整理sql中group by的用法与group by多个字段限制
更多相关阅读请进入《sql》频道 >>

数据库系统概念 第6版
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » SQL多表多字段比对方法实例代码
标签:sql
相关推荐
评论
管理员已关闭评论功能...