Sql 使用嵌套联接进行访问的完全外部联接
我正在尝试访问的完全外部联接解决方案。我的代码目前只处理一个表,但当我尝试嵌套其他左/右联接时,我得到了一个“3075语法错误”。我相信Access希望我在某个地方加引号或括号,但我尝试了几种不同的方法并进行了研究,似乎无法掌握它。任何帮助都将不胜感激!多谢各位Sql 使用嵌套联接进行访问的完全外部联接,sql,vba,ms-access,nested-loops,dao,Sql,Vba,Ms Access,Nested Loops,Dao,我正在尝试访问的完全外部联接解决方案。我的代码目前只处理一个表,但当我尝试嵌套其他左/右联接时,我得到了一个“3075语法错误”。我相信Access希望我在某个地方加引号或括号,但我尝试了几种不同的方法并进行了研究,似乎无法掌握它。任何帮助都将不胜感激!多谢各位 SQL = "" SQL = SQL & "SELECT " SQL = SQL & " t.* " SQL = SQL & "FROM " SQL = SQL & "
SQL = ""
SQL = SQL & "SELECT "
SQL = SQL & " t.* "
SQL = SQL & "FROM "
SQL = SQL & " ( "
SQL = SQL & " SELECT "
SQL = SQL & " [SummaryTbl].[WORK_ITEM_NMB] "
SQL = SQL & " , [SummaryTbl].[PROGRAM] "
SQL = SQL & " , [SummaryTbl].[WORK_ITEM_TYPE] "
SQL = SQL & " , [ParentChildTbl].[HasAssocWI] "
SQL = SQL & " FROM "
SQL = SQL & " SummaryTbl "
SQL = SQL & " LEFT JOIN "
SQL = SQL & " ParentChildTbl "
SQL = SQL & " ON "
SQL = SQL & " [SummaryTbl].
[WORK_ITEM_NMB] = [ParentChildTbl].[WORK_ITEM_NMB] "
SQL = SQL & " LEFT JOIN "
SQL = SQL & " ObjectsAffectedTbl "
SQL = SQL & " ON "
SQL = SQL & " [SummaryTbl].
[WORK_ITEM_NMB] = [ObjectsAffectedTbl].[WORK_ITEM_NMB] "
SQL = SQL & " "
SQL = SQL & " UNION "
SQL = SQL & " "
SQL = SQL & " SELECT "
SQL = SQL & " [ParentChildTbl].
[WORK_ITEM_NMB] "
SQL = SQL & " , [SummaryTbl].[PROGRAM] "
SQL = SQL & " , [SummaryTbl].[WORK_ITEM_TYPE] "
SQL = SQL & " , [ParentChildTbl].[HasAssocWI] "
SQL = SQL & " FROM "
SQL = SQL & " SummaryTbl "
SQL = SQL & " RIGHT JOIN "
SQL = SQL & " ParentChildTbl "
SQL = SQL & " ON "
SQL = SQL & " [SummaryTbl].
[WORK_ITEM_NMB] = [ParentChildTbl].[WORK_ITEM_NMB] "
SQL = SQL & " RIGHT JOIN "
SQL = SQL & " ObjectsAffectedTbl "
SQL = SQL & " ON "
SQL = SQL & " [SummaryTbl].
[WORK_ITEM_NMB] = [ObjectsAffectedTbl].[WORK_ITEM_NMB] "
SQL = SQL & " ) "
SQL = SQL & " t "
SQL = SQL & " WHERE "
SQL = SQL & " t.[WORK_ITEM_NMB] > 700"
Updated:
I added parenthesis as follows:
SQL = SQL & " FROM "
SQL = SQL & " (SummaryTbl "
SQL = SQL & " RIGHT JOIN "
SQL = SQL & " ParentChildTbl "
SQL = SQL & " ON "
SQL = SQL & " [SummaryTbl].
[WORK_ITEM_NMB] = [ParentChildTbl].[WORK_ITEM_NMB]) "
SQL = SQL & " RIGHT JOIN "
SQL = SQL & " ParentChildTbl "
SQL = SQL & " ON "
SQL = SQL & " [ParentChildTbl].
[WORK_ITEM_NMB] = [ObjectsAffectedTbl].[WORK_ITEM_NMB]) "
SQL = SQL & " ) "
我认为这些都在正确的位置,因为现在我在
Union
子句中得到了错误,而不是From子句。但我不确定现在如何处理联合
子句 在MS Access SQL中,多个JOIN
需要括号对。下面还使用了表别名以简化和可读性:
SELECT
t.*
FROM
(
SELECT
s.[WORK_ITEM_NMB]
, s.[PROGRAM]
, s.[WORK_ITEM_TYPE]
, p.[HasAssocWI]
FROM
(
(SummaryTbl s
LEFT JOIN
ParentChildTbl p
ON
s.[WORK_ITEM_NMB] = p.[WORK_ITEM_NMB]
)
LEFT JOIN
ObjectsAffectedTbl o
ON
s.[WORK_ITEM_NMB] = o.[WORK_ITEM_NMB]
)
UNION
SELECT
p.[WORK_ITEM_NMB]
, s.[PROGRAM]
, s.[WORK_ITEM_TYPE]
, p.[HasAssocWI]
FROM
(
(ObjectsAffectedTbl o
LEFT JOIN
ParentChildTbl p
ON
o.[WORK_ITEM_NMB] = p.[WORK_ITEM_NMB]
)
LEFT JOIN
SummaryTbl s
ON
o.[WORK_ITEM_NMB] = s.[WORK_ITEM_NMB]
)
) t
WHERE
t.[WORK_ITEM_NMB] > 700
顺便说一下,考虑在.sql(即文本文件)中保存上面的内容,并读入VBA字符串以避免连接和引用处理:
函数ReadSQL()作为字符串
Dim LoadFileStr As字符串
使用CreateObject(“Scripting.FileSystemObject”)
LoadFileStr=.OpenTextFile(“C:\Path\To\File.sql”,1).readall
以
ReadSQL=LoadFileStr
端接头
亚mySub
...
SQL=ReadSQL()
...
端接头
在Access中,对于返回列以外的任何复杂查询,应该使用保存的查询(引擎缓存最佳执行计划),而不是动态运行的VBA字符串查询。遗憾的是,我没有该选项。我确实添加了括号,我认为它在正确的位置,因为现在它告诉我Union子句有错误,而不是From子句。我不明白。所以你没有软件MSACCESS.EXE?您仍然可以在代码中创建存储查询。我必须关闭现有的只读数据库。现在,您的代码中出现了一个3296=Join表达式不受支持的错误。我想我需要加入o表。对p。不只是s,可能吧?我添加了另一个左右连接,如:SQL=SQL&“左连接”SQL=SQL&“对象受影响的TBL o”SQL=SQL&“在SQL=SQL&”上“p.[WORK\u ITEM\u NMB]=o.[WORK\u ITEM\u NMB]“SQL=SQL&”)“现在,对于union查询,我再次遇到错误3319。通常,
左连接在SQL中更容易读取。请参见调整反转台顺序和更换右连接
。