来自两个 table 的 UNION 记录和非 NULL 的支持字段(否则支持来自第一个 table 的值)

UNION records from two tables and favor fields that are not NULL (otherwise favor values from first table)

我在各种答案中奋力拼搏,取得了一些进展,但是,还没有找到最终的解决方案。

DB情况:

Table "clients_a":

userid | name 
1      | Steve
2      | John
3      | Paul

Table "clients_b":

userid | name 
1      | NULL
3      | Jokename
4      | Jessy

想要result/output:

userid | name 
1      | Steve
2      | John
3      | Paul
4      | Jessy

事件描述:


MySql 个我试过(并且接近)的查询:

尝试 1: 此查询有效,但不考虑名称。它采用 client_a:

中的所有名称
SELECT * FROM
(
    SELECT userid, name
    FROM `client_a`
    WHERE groupid = 123

    UNION DISTINCT 

    SELECT userid, name
    FROM `client_b`
    WHERE groupid = 123
) AS res
GROUP BY res.userid

尝试 2: 此查询创建了重复的条目(一个用户 ID 可以出现两次),但考虑到名称,因为它看起来是:

SELECT o.*, i.* FROM
(
    SELECT userid, name 
    FROM `client_a`
    WHERE groupid = 123

    UNION DISTINCT 

    SELECT userid, realname 
    FROM `client_b`
    WHERE groupid = 123
    
    GROUP BY userid
) AS o
LEFT JOIN `client_a` as i on i.userid = o.userid

我也试过用MIN(name)没成功。

感谢任何帮助。

你可以用 NOT EXISTS:

SELECT a.userid, a.name 
FROM clients_a a
WHERE a.groupid = 123
  AND (name IS NOT NULL OR NOT EXISTS (SELECT 1 FROM clients_b b WHERE b.userid = a.userid))
UNION  
SELECT b.userid, b.name 
FROM clients_b b
WHERE b.groupid = 123
  AND NOT EXISTS (SELECT 1 FROM clients_a a WHERE a.userid = b.userid AND a.name IS NOT NULL)

参见demo
结果:

userid name
1 Steve
2 John
3 Paul
4 Jessy