我遇到语法错误(缺少运算符)
请查看我的以下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 -
请指导我在代码中缺少的地方。
答案 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$]....
行(按原样,忽略它现在的时间长度)
让我知道它是怎么回事!
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 JOIN
或RIGHT JOIN
可能嵌套在INNER JOIN
内,但是。{INNER JOIN
可能未嵌套在LEFT JOIN
或RIGHT JOIN
内。 (在这种情况下,最后一部分不适用,因为你现在已经直接嵌套了INNER JOIN
。)