问题描述
我尝试在谷歌上搜索这种用例,但确实找到了我正在寻找的内容,需要通过有用的答案、文档或任何参考帮助达到特定点
我有这种情况:表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 | 空 |