SQL左连接未返回关联表无数据的主表行问题排查
左连接后未显示主表无匹配数据行的问题解决
嘿,这个问题我太熟悉了!你之所以没拿到inc表中100002那一行,核心原因是你把针对左连接表(work)的过滤条件放到了WHERE子句里,直接把左连接变成了内连接。
问题根源
左连接的本意是保留主表(inc)的所有行,哪怕关联的work表没有匹配数据(此时work字段会显示NULL)。但你在WHERE里加了work.SUBMIT_DATE = (子查询):当inc表的100002在work表中没有对应记录时,work.SUBMIT_DATE是NULL,而NULL和任何值做比较结果都是不成立的,所以这一行就被WHERE条件过滤掉了。
修正方案
把针对work表的过滤条件移到JOIN的ON子句里,这样就能在关联阶段就筛选出符合条件的work记录,同时保留主表的所有行。
方案一:调整条件位置到ON子句
SELECT inc.NUMBER as TICKET, inc.UNIV_NUM, inc.ASSIGNEE, work.SUBMIT_DATE, work.TYPE FROM dbo.HELP_DESK as inc LEFT JOIN dbo.WORKLOG as work ON inc.NUMBER = work.NUMBER AND work.SUBMIT_DATE = ( SELECT MAX(work2.SUBMIT_DATE) FROM dbo.WORKLOG as work2 WHERE work2.NUMBER = work.NUMBER AND work2.TYPE = '16000' ) WHERE inc.ASSIGNEE = 'AB049732'
方案二:先预聚合work表(更清晰高效)
如果work表数据量较大,先提前聚合出每个工单对应的最大提交日期,再左连接会更清晰,性能也更好:
WITH MaxWorkLog AS ( SELECT NUMBER, MAX(SUBMIT_DATE) AS SUBMIT_DATE, TYPE FROM dbo.WORKLOG WHERE TYPE = '16000' GROUP BY NUMBER, TYPE ) SELECT inc.NUMBER as TICKET, inc.UNIV_NUM, inc.ASSIGNEE, m.SUBMIT_DATE, m.TYPE FROM dbo.HELP_DESK as inc LEFT JOIN MaxWorkLog as m ON inc.NUMBER = m.NUMBER WHERE inc.ASSIGNEE = 'AB049732'
效果验证
这两种写法都会返回你预期的结果:inc表中的100002行会被保留,对应的work表字段(SUBMIT_DATE、TYPE)显示为NULL,其他匹配的行正常显示对应数据。
内容的提问来源于stack exchange,提问作者nixxrite
相关产品推荐
相关产品推荐

