Access中多条件第三次LEFT JOIN报错‘JOIN EXPRESSION NOT SUPPORTED’求助
解决LEFT JOIN多条件时的“JOIN EXPRESSION NOT SUPPORTED”错误
这个错误大概率是你用的Access Jet SQL引擎的限制导致的——它对嵌套JOIN里跨多表的条件支持很有限。你原来的SQL用了多层嵌套的括号包裹JOIN,最后一个BM_Allocations的JOIN条件同时引用了最外层的Flat_File和中间的Cost_Drivers表,这种跨多个JOIN层次的条件组合,Jet引擎会判定为“不支持的JOIN表达式”,这也是为什么去掉任一条件就能正常运行的原因——单一条件不会触发这个解析限制。
给你两个可行的修正方案:
方案1:扁平化JOIN结构
把嵌套的括号去掉,改成链式的JOIN写法,Jet引擎更能接受这种扁平化的结构:
SELECT * FROM Flat_File ff LEFT JOIN Cost_Drivers cd ON cd.Cost_Driver_Reported_Name = ff.Cost_Driver LEFT JOIN BM_IAA bmiaa ON bmiaa.Section_Name = cd.Cost_Driver_Billing_Model_Section_Name LEFT JOIN BM_Allocations bma ON bma.Fiscal_Year = ff.Fiscal_Year AND bma.Section_Name = cd.Cost_Driver_Billing_Model_Section_Name
方案2:用子查询整合前置表
先把前三个表的关联结果做成一个子查询,再和最后一个表做JOIN,这样最后一个JOIN的条件只需要引用子查询里的字段,避免跨层次的表引用:
SELECT * FROM ( SELECT ff.*, cd.*, bmiaa.* FROM Flat_File ff LEFT JOIN Cost_Drivers cd ON cd.Cost_Driver_Reported_Name = ff.Cost_Driver LEFT JOIN BM_IAA bmiaa ON bmiaa.Section_Name = cd.Cost_Driver_Billing_Model_Section_Name ) AS sub_query LEFT JOIN BM_Allocations bma ON bma.Fiscal_Year = sub_query.Fiscal_Year AND bma.Section_Name = sub_query.Cost_Driver_Billing_Model_Section_Name
需要注意的是,这个问题是Access特有的,如果你用的是SQL Server、MySQL这类数据库,原来的嵌套写法其实是没问题的。如果是在Access环境下,上面两种方法都能解决你的报错问题。
内容的提问来源于stack exchange,提问作者Solid Snake
相关产品推荐
相关产品推荐

