MS Access中WITH语句的替代方案及SQL查询适配问题
解决MS Access不支持WITH语句的适配方案
确实,MS Access的Jet/ACE SQL引擎不支持CTE(WITH子句),不过咱们可以把原查询里的CTE逻辑直接转换成Access能识别的形式,两种方案供你选择:
方案1:用内联子查询替代CTE
直接把原CTE的逻辑嵌入到JOIN子句中作为派生表,保持原连接逻辑不变即可:
SELECT * FROM ((T2_BRA INNER JOIN T2_HEAD ON T2_BRA.REF = T2_HEAD.REF) INNER JOIN ( SELECT SUBSTRING([T2_LOOK].[KEY],4,6) AS StkType, T2_LOOK.F1 AS MasterStocktype, -- 重要提示:原CTE未包含连接所需的SuppCode字段,这里需替换为T2_LOOK中对应供应商编码的实际字段 T2_LOOK.YourActualSuppCodeField AS SuppCode FROM T2_LOOK WHERE Left([T2_LOOK].[KEY],3)='CAT' ) AS Stocktype ON T2_HEAD.SUPPLIER = Stocktype.SuppCode)
关键说明
- 把原
WITH Stocktype AS (...)的定义直接移到JOIN里作为子查询,别名仍用Stocktype,确保连接逻辑无需修改。 - 原查询存在一个小问题:CTE的SELECT语句里没有包含连接所需的
SuppCode字段,我在子查询里补充了占位符,你需要根据T2_LOOK表的实际结构替换成正确的字段名,否则会出现“字段不存在”的错误。
方案2:创建独立查询对象复用逻辑
如果这个Stocktype的逻辑需要多次使用,更推荐把它做成一个单独的Access查询对象,之后在主查询里直接引用:
- 先新建一个名为
qryStocktype的查询,保存以下SQL:
SELECT SUBSTRING([T2_LOOK].[KEY],4,6) AS StkType, T2_LOOK.F1 AS MasterStocktype, -- 替换为T2_LOOK中实际的供应商编码字段 T2_LOOK.YourActualSuppCodeField AS SuppCode FROM T2_LOOK WHERE Left([T2_LOOK].[KEY],3)='CAT'
- 然后主查询可以简化为:
SELECT * FROM ((T2_BRA INNER JOIN T2_HEAD ON T2_BRA.REF = T2_HEAD.REF) INNER JOIN qryStocktype ON T2_HEAD.SUPPLIER = qryStocktype.SuppCode)
这种方式让主查询更简洁,也方便后续维护和复用Stocktype的逻辑。
内容的提问来源于stack exchange,提问作者Conor Shannon
相关产品推荐
相关产品推荐

