一、问题描述
假设有3个表,test_a
,test_b
,test_c
;
test_a
和test_b
中有些重复数据;
现在要把这2个表的数据同步到表c,但是重复数据只保留1行。
样例如下:
具体要求如下:
1.test_a
与test_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
存在的数据:
SELECTNULL AS user_id,b.card,b. NAME,b.authority
FROMtest_b b
LEFT JOIN test_a a ON b.card = a.card
WHEREa.id IS NULL
使用a.id is null
,就说明是test_b存在、test_a不存在了;
然后可以把这部分数据存入test_c
2.然后查询test_a 存在 && ( test_b 存在 || test_b 不存在)
的数据
SELECTa.user_id,a.card,ifnull(a.NAME, b.NAME),CASE
WHEN a.authority IS NULL
AND b.authority IS NULL THENNULL
WHEN a.authority IS NOT NULL
AND b.authority IS NOT NULL THENconcat(a.authority,',',b.authority)
WHEN a.authority IS NOT NULL
AND b.authority IS NULL THENa.authority
WHEN a.authority IS NULL
AND b.authority IS NOT NULL THENb.authority
ELSEa.authority
END AS authority
FROMtest_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,不符合预期;
//这样有些问题
//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
写法。