SQL Server代码转MS Access实现两表差异行查询求助
MS Access 两表差异行查询实现方案
你可以直接使用以下适配Access语法的查询代码,输出效果和你给出的SQL Server代码完全一致:
SELECT 'TableA' AS what, Col1, Col2, Col3 FROM TableA A WHERE NOT EXISTS ( SELECT 1 FROM TableB B WHERE B.Col1 = A.Col1 AND B.Col2 = A.Col2 AND Nz(B.Col3,0) = Nz(A.Col3,0) ) UNION ALL SELECT 'TableB' AS what, Col1, Col2, Col3 FROM TableB B WHERE NOT EXISTS ( SELECT 1 FROM TableA A WHERE A.Col1 = B.Col1 AND A.Col2 = B.Col2 AND Nz(A.Col3,0) = Nz(B.Col3,0) ) ORDER BY Col1, Col2
说明
- 该写法避开了Access不支持的
FULL OUTER JOIN、CROSS APPLY、EXCEPT语法,逻辑与原SQL Server代码完全等效:- 上半段查询TableA中不存在于TableB的行,包含「Col1+Col2匹配但Col3不同」「Col1+Col2仅TableA存在」两种场景,标记来源为
TableA - 下半段查询TableB中不存在于TableA的行,包含「Col1+Col2匹配但Col3不同」「Col1+Col2仅TableB存在」两种场景,标记来源为
TableB - 代码中使用Access内置的
Nz()函数处理NULL值对比问题,如果你的字段允许NULL值需要保留该函数,否则可以直接去掉
- 上半段查询TableA中不存在于TableB的行,包含「Col1+Col2匹配但Col3不同」「Col1+Col2仅TableA存在」两种场景,标记来源为
- 你之前写的全外连接实现,原SQL的关联条件是
Col1+Col2双字段匹配,注意不要漏写Col2的关联条件,本方案无需先实现全外连接再拆行,执行效率更高也更适配Access语法限制
内容的提问来源于stack exchange,提问作者MrClean
相关产品推荐
相关产品推荐

