You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:12:49