SQL Server无直接外键关联多表连接查询代码排查
参见以下附件:
表结构参考截图
问题背景
学习多表连接查询实现,当前场景为部分表与初始表无直接主键-外键关联关系,最终输出需要通过若干WHERE条件完成过滤。初始思路为通过DealsFurtherInfo表桥接无直接共有DealsUID字段、无法直接关联的Deals表与LocationPoints表。
涉及表结构
- 表: Deals
DealUID CounterPartyUID DealTypeUID TradeDate InactiveFlag
- 表: CParties
CounterPartyUID CounterPartyName
- 表: DealsFurtherInfo
DealUID LocationPointUID
- 表: LocationPoints
LocationPointUID LocationName
期望输出字段结构
DealUID CounterPartyName LocationName
原代码错误点
整体连接思路完全正确,所有问题都来自表名、字段名和实际结构不匹配,具体错误如下:
- 表名拼写错误:将实际表名
CParties写为CounterParties - 关联字段名不匹配:
Deals表与CParties表的关联字段为CounterPartyUID,原代码写为不存在的CpartyUIDDealsFurtherInfo与LocationPoints表的关联字段为LocationPointUID,原代码写为不存在的PointUID
- 返回字段错误:
LocationPoints表存储点位名称的字段为LocationName,原代码写为不存在的PointCode
修正后可运行代码
SELECT tblD.DealUID, tblCP.CounterPartyName, tblPP.LocationName FROM Deals tblD JOIN CParties tblCP ON tblD.CounterPartyUID = tblCP.CounterPartyUID JOIN DealsFurtherInfo tblDPL ON tblD.DealUID = tblDPL.DealUID JOIN LocationPoints tblPP ON tblDPL.LocationPointUID = tblPP.LocationPointUID WHERE tblD.DealTypeUID = 20110 AND tblD.InactiveFlag = 'N' AND tblD.TradeDate > '2019-01-01'
实现逻辑分步说明
- 选
Deals作为主表:所有过滤条件(交易类型、失效标识、交易时间)都基于这张表的字段,数据库执行时会先根据WHERE条件筛出符合要求的交易数据,减少后续关联的计算量。 - 直接关联有外键关系的表:
Deals和CParties通过公共字段CounterPartyUID做内连接,直接匹配出每笔交易对应的交易对手名称。 - 桥接表实现无直接关系表的关联:
Deals和LocationPoints没有公共关联字段,先通过公共字段DealUID关联桥接表DealsFurtherInfo,拿到每笔交易对应的点位IDLocationPointUID,再用这个ID关联LocationPoints表,就能匹配到对应的点位名称。 - 连接说明:当前用的是内连接,最终结果只会保留四张表中都能匹配到关联关系的数据。如果需要保留交易对手信息缺失、或者点位信息缺失的交易记录,可以将对应位置的
JOIN替换为LEFT JOIN。
内容的提问来源于stack exchange,提问作者TacOne
相关产品推荐
相关产品推荐

