SQL Server:将一个表与两个具有相同名称的表连接起来,但如果可用,则首先从表中选择所有数据,否则从第二个表中选择

问题描述

我尝试在谷歌上搜索这种用例,但确实找到了我正在寻找的内容,需要通过有用的答案、文档或任何参考帮助达到特定点

我有这种情况:表A必须与表B和表C连接; B 和 C 有相似的列,所以在选择部分会有重复的列名,但是如果有的话,优先选择表 B 的所有数据,否则显示来自表 c 的数据

例如:

SELECT 
    ae.*,ml.name as name,ml.contact AS contact,ve.name AS name,ve.contact AS contact
FROM 
    TABLE ae
LEFT JOIN 
    TABLE ml ON ae.eid = ml.eid
LEFT JOIN 
    TABLE ve ON ae.eid = ve.eid
WHERE
    ae.eid = 1

毫升数据

eid | name | contact
----+------+--------
1   | xyz  | null

已有数据

eid | name | contact
----+------+--------
1   | xyz  | 1

AE 数据

eid | gender
----+--------
1   | male

我想要这个结果:

eid | gender | name | contact
----+--------+------+--------
1   | male   | xyz  | null

但我现在得到这个:

eid | gender | name | contact | contact
----+--------+------+---------+--------
1   | male   | xyz  | 1       | null

我正在使用 node-mssql 驱动程序来查询 sql Server 数据。

谢谢,

解决方法

仅当 ve 中没有匹配的行时才必须加入 ml,并且如果在 ON 子句中添加条件 ... AND ml.eid IS NULL,则必须加入。
还可以使用 COALESCE() 首先从 ml 中选择列,如果它们从 ve 中不存在:

SELECT ae.*,COALESCE(ml.name,ve.name) AS name,COALESCE(ml.contact,ve.contact) AS contact
FROM ae
LEFT JOIN ml ON ae.eid = ml.eid
LEFT JOIN ve ON ae.eid = ve.eid AND ml.eid IS NULL
WHERE ae.eid = 1

参见demo
结果:

开斋节 性别 姓名 联系方式
1 xyz