MS SQL Server自连接SQL写法:查询音乐行业客户推荐的客户及推荐人
MS SQL Server 自连接查询修正方案
现有查询的问题定位
你当前编写的查询运行后仅能返回1条符合要求的记录,存在两处核心偏差:
- 自连接关联方向颠倒:表中
CCIdReferredby字段存储的是「当前行客户对应的推荐人ID」,正确关联逻辑应为:被推荐客户记录上的CCIdReferredby值,匹配推荐客户的主键CCid。而查询中写的c.CCid = r.CCIdReferredby是反向匹配,会导致C111(音乐行业客户,推荐了SkyJet)这条关联完全无法匹配,出现结果缺失。 - 隐式连接写法(
FROM后用逗号拼接多表)虽然语法在SQL Server中合法,但关联条件和筛选条件混在同一个WHERE子句中,可读性差,容易因漏写关联条件生成无意义的笛卡尔积结果。
可直接运行的正确查询
推荐使用的显式JOIN写法(结构清晰易维护)
SELECT c.CCName AS ReferredClientName, r.CCName AS ReferredBy FROM CorpClient c INNER JOIN CorpClient r ON c.CCIdReferredby = r.CCid WHERE r.CCIndustry = 'Music'
适配你原有书写习惯的修正版本
如果需要保留原本的隐式连接结构,仅需将关联条件的方向修正即可:
SELECT c.CCName, r.CCName AS ReferredBy FROM CorpClient c, CorpClient r WHERE c.CCIdReferredby = r.CCid AND r.CCIndustry = 'Music'
测试数据匹配验证
基于给出的CorpClient表结构与测试数据,上述查询返回的正确结果为:
| ReferredClientName | ReferredBy |
|---|---|
| SkyJet | BlingNotes |
| SouthAlps | WindyCT |
结果逻辑拆解:
- 音乐行业的推荐客户共2位:C111(BlingNotes)、C777(WindyCT)
- C111作为推荐人,对应被推荐客户为
CCIdReferredby = C111的C222(SkyJet) - C777作为推荐人,对应被推荐客户为
CCIdReferredby = C777的C888(SouthAlps) - 其余记录因推荐人不属于音乐行业,会被WHERE条件排除,不会出现在最终结果中。
内容的提问来源于stack exchange,提问作者sarmax25
相关产品推荐
相关产品推荐

