【问题标题】:Full Outer Join for Access with Nested Joins使用嵌套连接进行访问的完全外部连接
【发布时间】:2020-01-09 13:15:33
【问题描述】:

我正在尝试对 Access 进行完全外部联接的解决方法。我的代码目前适用于一个表,但是当我尝试嵌套额外的左/右连接时,我收到“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 子句中得到了错误。但我现在不确定如何处理 Union 子句。

【问题讨论】:

  • 在 Access 中,对于除返回列之外的任何复杂查询,应使用已保存的查询(该引擎缓存最佳执行计划),而不是动态运行 VBA 字符串查询。
  • 不幸的是,我没有那个选项。我确实添加了括号,我认为它在正确的位置,因为现在它告诉我 Union 子句而不是 From 子句有错误。
  • 我不明白。所以你没有这个软件,MSACCESS.EXE?您仍然可以在代码中创建存储查询。
  • 我必须处理现有的只读数据库。

标签: sql vba ms-access nested-loops dao


【解决方案1】:

在 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 字符串以避免连接和引号处理:

Function ReadSQL() As String
    Dim LoadFileStr As String

    With CreateObject("Scripting.FileSystemObject")
          LoadFileStr = .OpenTextFile("C:\Path\To\File.sql", 1).readall
    End With

    ReadSQL = LoadFileStr
End Sub

Sub mySub 
   ...
   SQL = ReadSQL()
   ...
End Sub

【讨论】:

  • 我的代码现在收到 3296 = Join expression not supported 错误。我想我需要加入表o。最佳。不只是 s.,也许吧?
  • 我添加了另一个左右连接,如下所示: SQL = SQL & " Left Join" SQL = SQL & " ObjectsAffectedTbl o" SQL = SQL & " ON" SQL = SQL & " p.[WORK_ITEM_NMB ] = o.[WORK_ITEM_NMB]" SQL = SQL & " )" 现在我再次收到联合查询的错误 3319。
  • 通常LEFT JOIN 在 SQL 中更容易阅读。见倒排表顺序调整和替换RIGHT JOIN
猜你喜欢
  • 2021-02-19
  • 2019-01-12
  • 1970-01-01
  • 2013-04-17
  • 2020-07-01
  • 1970-01-01
  • 2017-07-05
  • 2014-04-28
  • 2019-03-13
相关资源
最近更新 更多