SQL多表多字段比对方法
表-表比较
整体思路
- 两张表条数一样
- 条数相同是前提,然后比较字段值才有意义
- 两表字段值完全相同【两表所有字段的值相同】
- 两表所有字段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中id与name位置互换后,查询有值,就说明两者是多对多关系
证明id字段不是主键
- 下面2种写法结果一样
-- 写法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字段不是联合主键
SELECT ID,`NAME`
FROM A
GROUP BY ID,`NAME`
HAVING COUNT(*)>1
ORDER BY ID;
数据准备
-- 建表
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多表多字段比对方法的更多相关文章
- 获取sqlserver数据库中所有库、表、字段名的方法
获取sqlserver数据库中所有库.表.字段名的方法 2009年03月12日 星期四 下午 12:51 1.获取所有数据库名: SELECT Name FROM Master..SysDatabas ...
- SQL 把表中字段存储的逗号隔开内容转换成列表形式
原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式 我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ...
- SQL 查找表名 字段名
转载:http://www.accessoft.com/article-show.asp?id=6135 经常碰到一些忘记表名称的情况,此时只记得个大概,此时可通过查询系统表Sysobjects找到所 ...
- MyISAM表加字段的特殊方法
最近一个统计系统的大表需要加字段,表的引擎是myisam,表大小在3亿,物理文件在106G.想想都蛋疼.那么这种情况下怎么把字段撸上去呢? 1. 首先想到了<高性能MySQL>提到的直接更 ...
- SQL Server表和字段说明的增加和更新
1. 增加字段说明 EXEC sp_addextendedproperty 'MS_Description', 'some description', 'user', ...
- SQL 根据表获取字段字符串
SQLSERVER查询单个数据表所有字段名组合成的字符串脚本 --SQLSERVER查询单个数据表所有字段名组合成的字符串脚本 --应用场合: 用于生成SQL查询字符串中select 字段名列表1 f ...
- sql server 表2字段更新到表1,mysql
UPDATE kingdee_pro_stock set kingdee_pro_stock.org_name=ERP_BASIC_BILLNO_PREFIX.org_name,kingdee_pro ...
- sql 一个表的字段更新至另一个字段的方法
update Lc_Taxs set TaxMember = convert(int,Lc_Taxs2.TaxNo) from Lc_Taxs a,(select * from Lc_Taxs ) ...
- [原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式
我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ------> 从左边图转换成右边图,像这种需求,我们难免 ...
随机推荐
- Saltstack自动化扩容
一. etcd服务的安装和使用 1.安装etcd应用: wget https://github.com/coreos/etcd/releases/download/v2.2.5/etcd-v2.2.5 ...
- github 编写README时常用的写法
参考:https://github.com/HeTingwei/ReadmeLearn#%E7%BC%96%E5%86%99readme%E6%97%B6%E5%B8%B8%E7%94%A8%E7%9 ...
- yum下载安装git服务
yum install git 安装成功后,配置 用户 邮箱信息 注: youxiu326 github账号名称 youxiu326@163.com github账号对应邮箱 git confi ...
- SQL函数对应的数据库(案例)
- C/C++头文件以及避免头文件包含造成的重定义方法
C 头文件 头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享.有两种类型的头文件:程序员编写的头文件和编译器自带的头文件. 在程序中要使用头文件,需要使用 C 预处 ...
- Spark项目应用-电子商务大数据分析总结
一. 数据采集(要求至少爬取三千条记录,时间跨度超过一星期)数据采集到本地文件内容 爬取详见:python爬取京东评论 爬取了将近20000条数据,156个商品种类,用时2个多小时,期间中断数 ...
- JavaScript 中 append()、prepend()、after()、before() 的区别
内容 append().prepend().after().before() 的区别 jQuery 操作 DOM 之添加节点 方法名 作用 $(selector).append() 指定元素内部添加, ...
- java语言和jdk、jre基础
Java语言平台 * J2SE(Java 2 Platform Standard Edition)标准版 * 是为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可以完成一些桌 ...
- 异步任务-springboot
异步任务-springboot 异步:异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作.也就是说无论异步方法执行代码需要多长时间,跟主线程没有任何影响,主线程 ...
- 帝国CMS如何互相转移分表之间的数据
最近发现帝国CMS文章数据添加太多到某一张分表中了,如图 这是极其不合理的,需要优化下,所以这篇文章要告诉大家的也就是如何互相转移分表之间的数据. 我现在要将:phome_ecms_news_data ...