在Excel VBA中无法运行的SQL代码

3
我正在使用Excel 2010 VBA,并从PGSQL数据库查询3个表。下面的SQL代码在MS ACCESS中运行得非常完美:
SELECT user.surname,user.forename,recall.recalldate,telephone.number
FROM (user INNER JOIN recall ON user.entity_id = recall.master_id) 
LEFT JOIN Telephone ON recall.master_id=Telephone.master_id

但似乎无法转换到 EXCEL VBA:
Dim RECALL As String
RECALL = "SELECT user.surname,user.forename,recall.recalldate,telephone.number " _
        & "FROM (user INNER JOIN recall ON user.entity_id = recall.master_id) " _
        & "LEFT JOIN Telephone ON recall.master_id=Telephone.master_id " _

Set rs = conn.Execute(RECALL)
With ActiveSheet.QueryTables.Add(Connection:=rs, Destination:=Range("A1"))
  .Refresh
End With

我收到了一个运行时错误:...在FROM之后预期表源,得到(
用户表使用user.entity_id = recall.master_id链接到召回表,并显示所有用户的召回记录。然后我需要匹配用户的电话号码。并非所有用户都有电话号码,但无论是否有电话号码,我都需要所有的召回记录。
在VBA中的SQL代码有什么问题?

你正在比较两种不同的SQL方言:MS Access ACE/Jet SQL和PostgreSQL。其中一个区别是在连接中使用括号。如果在Access中链接PGSQL表,则会运行ACE/Jet方言。如果像在Excel中一样使用透传查询,则使用直接连接的PGSQL方言。如果在Access中运行透传查询,您将收到相同的错误。此外,“user”是两种方言中的保留字。要么转义,要么重命名。 - Parfait
2个回答

1
看起来您在 form 后面有一个 (),尝试不要加上


 SELECT user.surname,user.forename,recall.recalldate,telephone.number
 FROM  user INNER JOIN recall ON user.entity_id = recall.master_id
 LEFT JOIN Telephone ON recall.master_id=Telephone.master_id

这现在显示运行时错误:预处理器;关系“Telephone”不存在;SQLSTATE 42P01;SOURSE_FILE src\backend\parser\parse_relations.c;COURSE_line 984;SOURCE_FUNCTION parserOpenTable。 - BradleyS
检查电话或telephone,您在SELECT中使用小写,在JOIN中使用大写。否则,您没有这个名称的表。 - ScaisEdge
是的,就是这样。谢谢。 - BradleyS

0

是的,不同数据库可能有不同的SQL语句。通常情况下,SQL非常相似,但不同数据库之间总会存在细微差别。

在你有时间的时候,可以看一下下面链接中的这个小工具。它非常有用,可以将SQL转换为VBA。试试看,看看你能否使用它。

http://allenbrowne.com/ser-71.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接