OleDb异常:Left Join空布尔字段值因Order By子句被篡改?
Access OLE DB驱动左连接ORDER BY导致Yes/No字段Null值错误转为False的已知Bug
这是Microsoft Access OLE DB驱动的已知问题,仅在通过OleDb接口(包括Dapper这类基于OleDb的ORM)执行查询时触发,直接在Access客户端内执行相同SQL则无此异常。
触发场景
- 左连接查询中右表无匹配行
- 查询语句包含
ORDER BY子句 - 右表存在Yes/No类型字段
问题表现
右表的Yes/No字段本应返回Null,但被错误转换为False,同时依赖该字段Null判断的逻辑(如示例中的IIF(ChildTable.IsActive IS NULL...))也会失效,返回IS NOT NULL。
修复状态
目前微软官方未针对该Bug发布修复补丁,Access OLE DB驱动的更新优先级较低,该问题大概率不会被官方修复。
常见规避方案
- 显式通过关联字段判断来保留Null值:
SELECT MasterTable.ID, MasterTable.FirstName, ChildTable.ID, IIF(ChildTable.ID IS NULL, NULL, ChildTable.IsActive) AS IsActive, IIF(ChildTable.ID IS NULL, 'IS NULL', 'IS NOT NULL') As [TestNull] FROM MasterTable LEFT JOIN ChildTable ON MasterTable.ID = ChildTable.ID_MASTER ORDER BY MasterTable.ID
- 将原查询作为子查询,在外层添加ORDER BY:
SELECT * FROM ( SELECT MasterTable.ID, MasterTable.FirstName, ChildTable.ID, ChildTable.IsActive, IIF(ChildTable.IsActive IS NULL, 'IS NULL', 'IS NOT NULL') As [TestNull] FROM MasterTable LEFT JOIN ChildTable ON MasterTable.ID = ChildTable.ID_MASTER ) AS SubQuery ORDER BY ID
内容的提问来源于stack exchange,提问作者dovid
相关产品推荐
相关产品推荐

