VBA ADO中的以下SQL给出了“From子句中的语法错误”错误。
Sub RunSQL2()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strFile As String
Dim strCon As String
Dim strSQL As String
Dim ws As Worksheet
Dim strRangeAddress As String
Dim dataRange As Range
strFile = ThisWorkbook.Path & "\" & ThisWorkbook.Name
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open strCon
Set ws = ThisWorkbook.Sheets("mydata")
strRangeAddress = ActiveSheet.Name & "$" & ws.Range("A1:C30020").Address(False, False)
strSQL = strSQL & " (select s.* from "
strSQL = strSQL & " (select t.*, row_number() over (partition by child_level order by child_index,child_level) [rownum] from [" & strRangeAddress & "] t) s "
strSQL = strSQL & " where [rownum] = 1) u "
strSQL = strSQL & " join (select t2.*, 1 as [rownum] from [" & strRangeAddress & "] t2) v "
strSQL = strSQL & " on (v.parent_level = u.child_level and v.[rownum] = u.[rownum]) "
strSQL = strSQL & " union select w.child_index,w.child_level,w.child_level,w.child_index "
strSQL = strSQL & " from [" & strRangeAddress & "] w "
strSQL = strSQL & " where w.child_index = 1 "
strSQL = strSQL & " order by v.child_index;"
rs.Open strSQL, cn
Debug.Print rs.GetString
End Sub
strSQL的debug.print是:
select v.child_index,v.child_level,v.parent_level,u.child_index as parent_index
from
(select s.*
from
(select t.*, row_number() over (partition by child_level order by child_index,child_level) [rownum]
from [mydata$A1:C30020] t
) s
where [rownum] = 1
) u
join
(select t2.*, 1 as [rownum]
from [mydata$A1:C30020] t2
) v on (v.parent_level = u.child_level and v.[rownum] = u.[rownum])
union
select w.child_index,w.child_level,w.child_level,w.child_index
from [mydata$A1:C30020] w
where w.child_index = 1
order by v.child_index;
当我使用简单的strSQL字符串时,连接起作用并返回结果。这有效:
strSQL = "SELECT * FROM [" & strRangeAddress & "]"
我认为我的语法正确。是否可能由不兼容的SQL引起错误?例如,ADO可以做'分区'吗?
我正在使用Excel 2010 64位Office。
答案 0 :(得分:0)
考虑使用行号的相关计数聚合查询来代替窗口函数,因为此子查询应该符合Jet / ACE SQL中的要求:
SELECT v.child_index, v.child_level, v.parent_level, u.child_index, v.parent_index
FROM
(SELECT s.*
FROM
(SELECT t.*, (SELECT count(*) FROM [mydata$A1:C30020] sub
WHERE sub.child_index <= t.child_index
AND sub.child_level = t.child_level) as [rownum]
FROM [mydata$A1:C30020] t
) s
WHERE [rownum] = 1
) u
INNER JOIN
(SELECT t2.*, 1 as [rownum]
FROM [mydata$A1:C30020] t2
) v
ON (v.parent_level = u.child_level) AND (v.[rownum] = u.[rownum])
UNION
SELECT w.child_index, w.child_level, w.parent_level, w.child_index, w.parent_index
FROM [mydata$A1:C30020] w
WHERE w.child_index = 1
ORDER BY v.child_index;