通过 Excel VBA 进行 SQL 查询的复杂 JOIN 子句中的语法错误
Posted
技术标签:
【中文标题】通过 Excel VBA 进行 SQL 查询的复杂 JOIN 子句中的语法错误【英文标题】:Syntax error in complicated JOIN clause of SQL query through Excel VBA 【发布时间】:2019-01-22 00:24:24 【问题描述】:我需要加入 4 个表,其中包含可以链接的以下字段:
-
tblModels (TRADE_DATE, MODEL)
tblModelDef(模型、资产)
tblFutPx(交易日期,资产)
tblTA(交易日期,资产)
我想“左加入”tblModels-即我想显示 tblModels 的所有数据,并在对应的 [TRADE_DATE] 可用时显示 tblFutPx 和 tblTA 的数据。所以相关数据的链接是[TRADE_DATE]和[ASSET],但是我需要使用tblModelDef作为tblModels和tblFutPx & tblTA之间的桥梁。
我不断收到“JOIN 操作中的语法错误”错误。
我一直试图让它工作太久了,但这就是我所在的地方。我已经尝试简化 FROM 子句以确保错误来自它,它确实是。
FROM ((tblModels INNER JOIN tblModelDef ON tblModels.[MODEL] = tblModelDef.[MODEL]) LEFT JOIN tblFutPx ON (tblModelDef.[ASSET] = tblFutPx.[ASSET]) AND (tblModels.[TRADE_DATE] = tblFutPx.[TRADE_DATE])) LEFT JOIN (tblTA ON (tblModels.[TRADE_DATE] = tblTA.[TRADE_DATE]) AND (tblModelDef.[ASSET] = tblTA.[ASSET]))
【问题讨论】:
究竟是什么关系? 1 模型有很多资产?每个 Trade_Date 有很多 Asset? 感谢您的帮助 - 每个模型都有 1 个资产 intblModelDef。 tblModels 中的每个模型都有一个 TRADE_DATE。在 tblFutPx 和 tblTA 中,每个资产都有一个 TRADE_DATE。关键是显示 tblModels 的所有数据(每个 TRADE_DATE/MODEL 组合有一条记录),并包括 tblTA 和 tblFutPx 中的数据(如果该 TRADE_DATE/ASSET 组合可用)。 【参考方案1】:可能需要多个查询才能完成。建表并使用查询生成器来设计查询。没有分配任何主键,只是将链接设置为“显示来自 tblModels 的所有记录...”。访问使用了 RIGHT JOIN。
查询1:
SELECT tblModelDef.Model, tblModelDef.Asset, tblModels.Trade_Date
FROM tblModelDef RIGHT JOIN tblModels ON tblModelDef.Model = tblModels.Model;
查询2:
SELECT Query1.Model, tblFutPx.Trade_Date, tblFutPx.Asset, tblTA.Trade_Date, tblTA.Asset
FROM tblFutPx RIGHT JOIN (tblTA RIGHT JOIN Query1 ON (tblTA.Asset = Query1.Asset) AND (tblTA.Trade_Date = Query1.Trade_Date)) ON (tblFutPx.Asset = Query1.Asset) AND (tblFutPx.Trade_Date = Query1.Trade_Date);
多合一嵌套:
SELECT Query1.Model, tblFutPx.Trade_Date, tblFutPx.Asset, tblTA.Trade_Date, tblTA.Asset
FROM tblFutPx RIGHT JOIN (tblTA RIGHT JOIN
(SELECT tblModelDef.Model, tblModelDef.Asset, tblModels.Trade_Date
FROM tblModelDef RIGHT JOIN tblModels ON tblModelDef.Model = tblModels.Model) AS Query1
ON (tblTA.Asset = Query1.Asset) AND (tblTA.Trade_Date = Query1.Trade_Date)) ON (tblFutPx.Asset = Query1.Asset) AND (tblFutPx.Trade_Date = Query1.Trade_Date);
【讨论】:
我一直在拼命地适应这一点,因为我很确定我理解这里的逻辑(它应该可以工作!)。我不得不修改一下以检索适当的字段。这是我现在所处的位置,但我不断收到“没有为一个或多个必需参数提供值”错误。SELECT tblFutPx.[CLOSE_C], Query1.[PX_ACT_R], tblTA.[RSI] FROM tblFutPx RIGHT JOIN (tblTA RIGHT JOIN (SELECT tblModels.[PX_ACT_R], tblModels.[TRADE_DATE], tblModelDef.[ASSET] FROM tblModelDef INNER JOIN tblModels ON tblModels.[MODEL] = tblModelDef.[MODEL]) AS Query1 ON (tblTA.[ASSET] = Query1.[ASSET]) AND (tblTA.[TRADE_DATE] = Query1.[TRADE_DATE])) ON (tblFutPx.[ASSET] = Query1.[ASSET]) AND (tblFutPx.[TRADE_DATE] = Query1.[TRADE_DATE]) WHERE Query1.[TRADE_DATE] BETWEEN #1/1/2012# AND #1/21/2019# AND Query1.[MODEL] = 'CPE_R_SA_M' ORDER BY Query1.[TRADE_DATE] ASC
知道了!我没有在嵌套的 Query1 的 SELECT 子句中包含 tblModels.[MODEL],然后我稍后尝试对其进行 WHERE 过滤。这现在有效 - 再次感谢您的帮助!以上是关于通过 Excel VBA 进行 SQL 查询的复杂 JOIN 子句中的语法错误的主要内容,如果未能解决你的问题,请参考以下文章
从 Excel VBA 运行工作参数化 Access SQL 查询 (INSERT INTO) 时出现“需要对象”错误
直接和通过 VBA excel 运行相同的存储 Access SQL 查询时获得不同的结果