通过 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 查询时获得不同的结果

通过 excel VBA 加入 SQL 表时出错

Oracle SQL 到 Excel - 集成

excel 2010 vba。 sql查询列'like' vlookup

使用 VBA 在 Excel 中的 SQL 表上使用参数化查询