Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用嵌套联接进行访问的完全外部联接_Sql_Vba_Ms Access_Nested Loops_Dao - Fatal编程技术网

Sql 使用嵌套联接进行访问的完全外部联接

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 & "

我正在尝试访问的完全外部联接解决方案。我的代码目前只处理一个表,但当我尝试嵌套其他左/右联接时,我得到了一个“3075语法错误”。我相信Access希望我在某个地方加引号或括号,但我尝试了几种不同的方法并进行了研究,似乎无法掌握它。任何帮助都将不胜感激!多谢各位

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中更容易读取。请参见调整反转台顺序和更换
右连接