Sql 多个内部联接时查询表达式VBA中出现语法错误(缺少运算符)

Sql 多个内部联接时查询表达式VBA中出现语法错误(缺少运算符),sql,vba,excel,adodb,Sql,Vba,Excel,Adodb,我发现语法错误(缺少运算符) 请在下面找到我的VBA代码 Sub macro() sql_string = "SELECT [Sheet2$].[Sr], [no], [Code], [Sheet3$].[Srr], [Family], [nos], [Sheet1$].[Sr], [LongName]" & _ " FROM [Sheet3$], [Sheet2$], [Sheet1$] INNER JOIN [Sheet2$] ON [Sheet2$].[Sr]=[Sheet3$

我发现语法错误(缺少运算符)

请在下面找到我的VBA代码

Sub macro()

sql_string = "SELECT [Sheet2$].[Sr], [no], [Code], [Sheet3$].[Srr], [Family], [nos], [Sheet1$].[Sr], [LongName]" & _
" FROM [Sheet3$], [Sheet2$], [Sheet1$] INNER JOIN [Sheet2$] ON [Sheet2$].[Sr]=[Sheet3$].[Srr]" & _
" INNER JOIN [Sheet2$] ON [Sheet2$].[no]=[Sheet3$].[nos]"

sq = SQL_query(sql_string)

end sub

Function SQL_query(ByRef sql_string As Variant)

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

strSQL = sql_string

rs.Open strSQL, cn

Sheet5.Range("A21").CopyFromRecordset rs
End Function
请查看下表

表1-

表2-

表3-


请指出代码中缺少的地方。

解决VBA中凌乱的SQL查询的一个好方法是将它们分解,因为SQL将忽略所有额外的空格和换行符,但我们将能够更好地理解它,并发现问题

因此,我们可以使用查询将您的行拆分为:

sql_string = "
    SELECT
        [Sheet2$].[Sr],
        [no],
        [Code], 
        [Sheet3$].[Srr], 
        [Family], 
        [nos], 
        [Sheet1$].[Sr], 
        [LongName]
    FROM [Sheet3$], [Sheet2$], [Sheet1$] 
    INNER JOIN [Sheet2$] 
        ON [Sheet2$].[Sr]=[Sheet3$].[Srr]
    INNER JOIN [Sheet2$] 
        ON [Sheet2$].[no]=[Sheet3$].[nos]"
现在我们可以看到连接中的一些混淆,我在下面进一步整理了这些混淆,以及所有字段中指定的表名。有两个问题,例如,不能将3个表连接到1个表,但可以在两个表之间进行连接,然后在“that”和第三个表之间进行连接

sql_string = "
    SELECT
        [Sheet2$].[Sr],
        [Sheet2$].[no],
        [Sheet2$].[Code], 

        [Sheet3$].[Srr], 
        [Sheet3$].[nos], 
        [Sheet3$].[Family], 


        [Sheet1$].[Sr], 
        [Sheet1$].[LongName]

    FROM [Sheet2$]
    INNER JOIN [Sheet3$]
        ON [Sheet2$].[Sr]=[Sheet3$].[Srr]

    INNER JOIN [Sheet1$] 
        ON [Sheet1$].[Sr]=[Sheet3$].[Srr]"
粘贴该行以替换您的
sql\u string=“SELECT[Sheet2$]..
行(按原样,忽略它现在的长度)

让我知道进展如何


这里有一个链接,链接到更多关于 还可以使用以下语法在JOIN语句中链接多个ON子句:

SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1compoprtable2.field1 AND
ON table1.field2compoprtable2.field2) OR
ON table1.field3compoprtable2.field3)];
SELECT fields FROM table1 INNER JOIN (table2 INNER JOIN [( ]table3
[INNER JOIN [( ]tablex [INNER JOIN ...)] ON
table3.field3compoprtablex.fieldx)] ON
table2.field2compoprtable3.field3) ON
 table1.field1compoprtable2.field2;
您还可以使用以下语法嵌套JOIN语句:

SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1compoprtable2.field1 AND
ON table1.field2compoprtable2.field2) OR
ON table1.field3compoprtable2.field3)];
SELECT fields FROM table1 INNER JOIN (table2 INNER JOIN [( ]table3
[INNER JOIN [( ]tablex [INNER JOIN ...)] ON
table3.field3compoprtablex.fieldx)] ON
table2.field2compoprtable3.field3) ON
 table1.field1compoprtable2.field2;
左连接
右连接
可以嵌套在
内部连接
中,但是
内部联接
不能嵌套在
左联接
右联接
中。 (最后一部分不应适用于这种情况,因为您现在有了直接嵌套的
内部联接
s。)


根据您的指导,感谢所有人的帮助

以下语法适用于多重内部联接

sql_string = "SELECT [Sheet2$].[Sr], [no], [Code], [Sheet3$]." & _
    "[nos], [Family], [Sheet1$].[LongName]" & _
    " FROM (([Sheet2$] INNER JOIN [Sheet3$] ON [Sheet2$].[Sr]=[Sheet3$].[Srr])" & _
    " INNER JOIN [Sheet1$] ON [Sheet1$].[Sr]=[Sheet3$].[Srr])"

代码在哪一行中断?是不是
rs.Open strSQL,cn
?@ashleedawg是的,先生..在Access中,ACE,我相信您一次只能连接两个表。我以前尝试过,但最终失败了(SQL Server,这会起作用)。您必须按照此答案重新构造它,您可以连接多个表,我认为这不是问题