在多次JOIN查询中使用同一张表获取客户对应运营商名称
调整后的SQL语句及说明
原语句存在的问题
- 未实现优先级判断逻辑:没有优先取TableA的operatorid,为空时才取TableC中符合条件的operatorid
- 存在多处语法错误:
LIKE S1未给字符串加引号,TableC和TableB的关联条件缺少AND关键字,TableB关联时未声明别名b - 多余字段:SELECT子句中出现了目标结果不需要的
c.ClientName字段,且你提供的表结构中不存在存储该字段的表
正确查询语句
SELECT c.ClientID AS 'Client id', b.operatorname AS 'Operator Name' FROM Clienttable c LEFT JOIN TableA a ON c.ClientID = a.clientid LEFT JOIN ( SELECT DISTINCT `Client id` AS clientid, Operatorid FROM TableC WHERE Description = 'S1' ) tc ON c.ClientID = tc.clientid LEFT JOIN TableB b ON b.Operatorid = COALESCE(a.Operatorid, tc.Operatorid) ORDER BY c.ClientID;
逻辑说明
- 先用子查询把TableC里符合
Description='S1'的clientid和对应operatorid去重,避免同一个clientid出现多条重复数据 - 用
COALESCE函数优先取TableA的operatorid,TableA的operatorid为空时自动取TableC的operatorid - 用合并后的operatorid关联TableB拿到对应的操作员名称,输出的字段和别名完全匹配目标结果
内容的提问来源于stack exchange,提问作者Salman81
相关产品推荐
相关产品推荐

