SQL多表多字段比对方法实例代码
吾爱主题
阅读:164
2024-04-01 23:25:28
评论:0
表-表比较
整体思路
- 两张表条数一样
- 条数相同是前提,然后比较字段值才有意义
- 两表字段值完全相同【两表所有字段的值相同】
- 两表所有字段union后,条数与另一张表条数一样
- 两表字段值部分相同【两表部分字段的值相同】
- 原理:union有去重功能
- 两表部分字段union后,条数与另一张的count(distinct 部分字段)一样
- 找出不同字段的明细
找出不同字段的明细
T1/T2两表ID相同的部分,是否存在不同NAME
?1 2 3 4 5 6 7 | 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种查询结果相同
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 | -- 写法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种写法结果一样
1 2 3 4 5 6 | -- 写法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
?1 2 3 4 | SELECT ID,` NAME `, COUNT (*) FROM A GROUP BY ID HAVING COUNT (` NAME `)>1; |
修改后:
?1 2 3 4 | SELECT ID, COUNT ( DISTINCT ` NAME `) FROM A GROUP BY ID HAVING COUNT ( DISTINCT ` NAME `)>1; |
这样就说明id与name是一对多的关系
扩展:多对多关系,上述SQL中id与name位置互换后,查询有值,就说明两者是多对多关系
证明id字段不是主键
- 下面2种写法结果一样
1 2 3 4 5 6 7 8 9 10 | -- 写法01 SELECT ID FROM A GROUP BY ID HAVING COUNT (*)>1; -- 写法02 SELECT ID, COUNT (ID) FROM A GROUP BY ID HAVING COUNT (ID)>1; |
证明id, name字段不是联合主键
?1 2 3 4 5 | SELECT ID,` NAME ` FROM A GROUP BY ID,` NAME ` HAVING COUNT (*)>1 ORDER BY ID; |
数据准备
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | -- 建表 CREATE TABLE IF NOT EXISTS TEST01.A ( ID VARCHAR (50) COMMENT 'ID号' -- 01 ,NUMS INT COMMENT '数字' -- 02 , NAME VARCHAR (50) COMMENT '名字' -- 03 ) COMMENT 'A表' STORED AS PARQUET ; -- 插数 INSERT INTO TEST01.A (ID,NUMS, NAME ) VALUES ( '01' ,1, NULL ); INSERT INTO TEST01.A (ID,NUMS, NAME ) VALUES ( '02' ,2, '' ); INSERT INTO TEST01.A (ID,NUMS, NAME ) VALUES ( '03' ,3, 'c' ); -- 删数 DELETE FROM TEST01.A WHERE ID = '04' ; -- 删表 DROP TABLE IF EXISTS TEST01.A; |
总结
到此这篇关于SQL多表多字段比对方法的文章就介绍到这了,更多相关SQL多表多字段比对内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.cnblogs.com/fylhd2013/p/16273402.html
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。