数据库存在数据但SQL查询丢失部分行的问题求助
问题分析与解决方法
你的问题核心是INNER JOIN过滤掉了部分记录,同时GROUP BY字段的变化也影响了最终结果行数。以下是具体的排查和解决步骤:
1. 替换连接类型为LEFT JOIN
INNER JOIN只会返回两张表中匹配成功的记录,如果你需要保留CS_AU的所有符合条件的记录(哪怕CS_DOCTYPE里没有对应描述),应该改用LEFT JOIN:
SELECT DISTINCT AU.A_DOC_TYPE, COUNT(*) AS Count, DT.DOC_TYPE_DESC FROM dbo.CS_AU AU LEFT JOIN vf.vis.dbo.CS_DOCTYPE DT ON DT.DOC_TYPE = AU.A_DOC_TYPE WHERE AU.A_ACTION = 'I' AND AU.A_DATE BETWEEN '2022-01-01' AND '2022-12-31' AND AU.A_TO_NODE = 2 GROUP BY AU.A_DOC_TYPE, DT.DOC_TYPE_DESC ORDER BY AU.A_DOC_TYPE
这样即使DOC_TYPE_DESC不存在,也会显示为NULL,而CS_AU的所有符合条件的记录都会被保留。
2. 验证缺失的A_DOC_TYPE是否真的存在于CS_DOCTYPE
你可以用下面的SQL检查哪些A_DOC_TYPE在CS_DOCTYPE里没有匹配项:
SELECT DISTINCT A_DOC_TYPE FROM dbo.CS_AU WHERE A_ACTION = 'I' AND A_DATE BETWEEN '2022-01-01' AND '2022-12-31' AND A_TO_NODE = 2 AND A_DOC_TYPE NOT IN (SELECT DOC_TYPE FROM vf.vis.dbo.CS_DOCTYPE)
如果返回结果,说明确实存在不匹配的情况,常见原因包括:
- 数据类型不一致(比如一个是
CHAR,一个是VARCHAR,导致尾部空格差异) - 大小写或特殊字符差异(比如
'PO'和'po') - 视图
vf.vis.dbo.CS_DOCTYPE的权限限制,导致你看不到完整数据
3. 先聚合再关联(更稳妥的方式)
如果每个A_DOC_TYPE对应唯一的DOC_TYPE_DESC,可以先对CS_AU进行聚合得到198行结果,再关联CS_DOCTYPE获取描述,避免JOIN影响聚合结果:
SELECT agg.A_DOC_TYPE, agg.Count, DT.DOC_TYPE_DESC FROM ( SELECT A_DOC_TYPE, COUNT(*) AS Count FROM dbo.CS_AU WHERE A_ACTION = 'I' AND A_DATE BETWEEN '2022-01-01' AND '2022-12-31' AND A_TO_NODE = 2 GROUP BY A_DOC_TYPE ) agg LEFT JOIN vf.vis.dbo.CS_DOCTYPE DT ON DT.DOC_TYPE = agg.A_DOC_TYPE ORDER BY agg.A_DOC_TYPE
这种写法确保聚合结果不受JOIN的影响,同时能获取到对应的描述信息。
内容的提问来源于stack exchange,提问作者SJac
相关产品推荐
相关产品推荐

