一、问题描述
假设有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
存在的数据:
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 不存在)
的数据
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,不符合预期;
//这样有些问题
//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
写法。