mysql多表重复数据只保留一行的思路

一、问题描述

假设有3个表,test_atest_btest_c

test_atest_b中有些重复数据;

现在要把这2个表的数据同步到表c,但是重复数据只保留1行。

样例如下:


具体要求如下:

1.test_atest_b中都存在的数据(根据card关联),以test_a为准,并且把authority字段拼起来(逗号分隔),移动到test_c

2.对于test_a不存在但是test_b存在的数据,以test_b为准,移动到test_c

3.对于test_a存在但是test_b不存在的数据,以test_a为准,移动到test_c

二、sql样例

1.首先查询到test_a不存在但是test_b存在的数据:

a 复制代码
SELECT
	NULL AS user_id,
	b.card,
	b. NAME,
	b.authority
FROM
	test_b b
LEFT JOIN test_a a ON b.card = a.card
WHERE
	a.id IS NULL

使用a.id is null,就说明是test_b存在、test_a不存在了;

然后可以把这部分数据存入test_c

2.然后查询test_a 存在 && ( test_b 存在 || test_b 不存在)的数据

a 复制代码
SELECT
	a.user_id,
	a.card,
	ifnull(a.NAME, b.NAME),
	CASE
WHEN a.authority IS NULL
AND b.authority IS NULL THEN
	NULL
WHEN a.authority IS NOT NULL
AND b.authority IS NOT NULL THEN
	concat(
		a.authority,
		',',
		b.authority
	)
WHEN a.authority IS NOT NULL
AND b.authority IS NULL THEN
	a.authority
WHEN a.authority IS NULL
AND b.authority IS NOT NULL THEN
	b.authority
ELSE
	a.authority
END AS authority
FROM
	test_a a
LEFT JOIN test_b b ON a.card = b.card

使用了ifnull(a.NAME, b.NAME),,可以当test_a表的数据为空时(不准确了),使用test_b表的数据;

注意这里有个坑,使用concat(a.authority,',',b.authority)时,如果有一个表的数据为null,那么最终结果就会是null,不符合预期;

a 复制代码
//这样有些问题
//select a.user_id,a.card,a.name,a.authority,b.authority,concat(a.authority,',',b.authority) from test_a a left join test_b b on a.card=b.card 

并且还需要判断是否需要拼接,

因此sql中使用了case when写法。

相关推荐
shengli72215 分钟前
Python在金融科技(FinTech)中的应用
jvm·数据库·python
xcLeigh15 分钟前
IoTDB Python原生接口全攻略:从基础读写到高级实战
开发语言·数据库·python·api·iotdb·原生接口·读写数据
xcLeigh20 分钟前
Python操作国产金仓数据库(KingbaseES)全流程:从环境搭建到实战应用
开发语言·数据库·python·国产数据库·kingbasees·金仓数据库
人道领域1 小时前
Day | 11 【苍穹外卖统计业务的实现:含详细思路分析】
java·数据库·后端·苍穹外卖
数据库幼崽1 小时前
proxy SQL官方文档之MySQL监控模块
mysql
ZTLJQ8 小时前
数据的基石:Python中关系型数据库完全解析
开发语言·数据库·python
升鲜宝供应链及收银系统源代码服务8 小时前
《IntelliJ + Claude Code + Gemini + ChatGPT 实战配置手册升鲜宝》
java·前端·数据库·chatgpt·供应链系统·生鲜配送
冬奇Lab8 小时前
AudioRecord音频录制流程深度解析
android·音视频开发·源码阅读
跟着珅聪学java9 小时前
js编写中文转unicode 教程
前端·javascript·数据库
小江的记录本9 小时前
【Redis】Redis全方位知识体系(附《Redis常用命令速查表(完整版)》)
java·数据库·redis·后端·python·spring·缓存