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

时间:2017-10-31 13:21:31

标签: sql vba excel-vba adodb excel

我遇到语法错误(缺少运算符)

enter image description here

请查看我的以下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 -

enter image description here

表2 -

enter image description here

表3 -

enter image description here

请指导我在代码中缺少的地方。

2 个答案:

答案 0 :(得分:2)

感谢大家的帮助,根据您的指导。

以下语法适用于多个内连接。

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])"

答案 1 :(得分:1)

在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个表,但是你可以在两个表之间进行连接,然后在“那个”和第三个表之间进行连接。

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_string = "SELECT [Sheet2$]....行(按原样,忽略它现在的时间长度)

让我知道它是怎么回事!

这是指向nested Inner Joins from Microsoft Support

的更多信息的链接
  

您还可以使用以下语法链接JOIN语句中的多个ON子句:

SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1compoprtable2.field1 AND
ON table1.field2compoprtable2.field2) OR
ON table1.field3compoprtable2.field3)];
     

您还可以使用以下语法嵌套JOIN语句

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;
     

LEFT JOINRIGHT JOIN可能嵌套在INNER JOIN内,但是。{   INNER JOIN可能未嵌套在LEFT JOINRIGHT JOIN内。   (在这种情况下,最后一部分不适用,因为你现在已经直接嵌套了INNER JOIN。)