SQL查询通话被叫对应用户时B.Person无法绑定错误如何解决?
语法错误原因
- 你在
EXISTS子查询中定义的表别名B的作用域仅局限于EXISTS后的括号内,外层查询无法访问子查询内部的别名,因此会抛出B.Person 无法绑定的报错。 - 你在
CASE WHEN的THEN分支写的B.Person = A.Person是布尔判断逻辑,返回的是真假值,不是你需要的返回被叫用户姓名的逻辑。
正确实现方案
你需要先构建号码-归属人映射关系:只要某个号码作为主叫From_Number出现过,就和对应的用户绑定,再用通话表的被叫号码To_Number和这个映射表关联即可,匹配不到就返回未知标识。
推荐写法:LEFT JOIN关联映射表
SELECT a.Person, a.Date, a.From_Number, a.To_Number, COALESCE(b.Person, 'unkn') AS person_called FROM dbo.mobile_data a -- 左连接保证所有通话记录都保留,匹配不到归属人的号码返回unkn LEFT JOIN ( -- 构建去重的号码-归属人映射表 SELECT DISTINCT From_Number AS Number, Person FROM dbo.mobile_data ) b ON a.To_Number = b.Number
替代写法:关联子查询
如果不想用JOIN,也可以用子查询直接返回匹配的用户名:
SELECT a.Person, a.Date, a.From_Number, a.To_Number, COALESCE( -- 子查询匹配被叫号码对应的归属人,TOP 1避免一个号码对应多个人的脏数据问题 (SELECT TOP 1 b.Person FROM dbo.mobile_data b WHERE b.From_Number = a.To_Number), 'unkn' ) AS person_called FROM dbo.mobile_data a
两种写法返回的结果和你给出的期望输出完全一致。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

