使用 UNION ALL 查询在 FROM 子句中出现语法错误

Posted

技术标签:

【中文标题】使用 UNION ALL 查询在 FROM 子句中出现语法错误【英文标题】:Getting a Syntax error in FROM clause with UNION ALL query 【发布时间】:2019-11-24 08:23:40 【问题描述】:

我有一个 Union All 查询,我目前正在从中运行生成表查询。我试图将它们合并为一件事,并让联合所有查询也只是制作表格。我在这里动态学习,任何人都在尝试 INTO 方法,我可以将其作为一个生成表来工作,但是一旦我添加 UNION ALL,我就会得到语法错误。

对我做错的任何帮助将不胜感激。

SELECT *
INTO tbl_Test
FROM
    (SELECT 
         qry_BomLevel1_PartNo.Type, qry_BomLevel1_PartNo.PartNo, 
         qry_BomLevel1_Desc.Description, qry_BomLevel1_Rev.Revision, 
         qry_BomLevel1_PartNo.Qty, qry_BomLevel1_Comment.Comment
     FROM 
         qry_BomLevel1_PartNo 
     LEFT JOIN 
         ((qry_BomLevel1_Desc 
     LEFT JOIN 
         qry_BomLevel1_Rev ON (qry_BomLevel1_Desc.XRefConfigurationID = qry_BomLevel1_Rev.XRefConfigurationID) 
                           AND (qry_BomLevel1_Desc.ChildRevNr = qry_BomLevel1_Rev.ChildRevNr) 
                           AND (qry_BomLevel1_Desc.ChildID = qry_BomLevel1_Rev.ChildID)) 
     LEFT JOIN 
         qry_BomLevel1_Comment ON (qry_BomLevel1_Rev.XRefConfigurationID = qry_BomLevel1_Comment.XRefConfigurationID) 
                               AND (qry_BomLevel1_Rev.ChildRevNr = qry_BomLevel1_Comment.ChildRevNr) 
                               AND (qry_BomLevel1_Rev.ChildID = qry_BomLevel1_Comment.ChildID)) 
          ON (qry_BomLevel1_PartNo.XRefConfigurationID = qry_BomLevel1_Desc.XRefConfigurationID) 
          AND (qry_BomLevel1_PartNo.ChildRevNr = qry_BomLevel1_Desc.ChildRevNr) 
          AND (qry_BomLevel1_PartNo.ChildID = qry_BomLevel1_Desc.ChildID)

    UNION ALL

    SELECT 
        qry_BomLevel2_PartNo.Type, qry_BomLevel2_PartNo.PartNo, 
        qry_BomLevel2_Desc.Description, qry_BomLevel2_Rev.Revision, 
        qry_BomLevel2_PartNo.Qty, qry_BomLevel2_Comment.Comment
   FROM 
        qry_BomLevel2_PartNo 
   LEFT JOIN 
       ((qry_BomLevel2_Desc 
   LEFT JOIN 
       qry_BomLevel2_Rev ON (qry_BomLevel2_Desc.ChildID = qry_BomLevel2_Rev.ChildID) 
                         AND (qry_BomLevel2_Desc.ChildRevNr = qry_BomLevel2_Rev.ChildRevNr) 
                         AND (qry_BomLevel2_Desc.XRefConfigurationID = qry_BomLevel2_Rev.XRefConfigurationID)) 
   LEFT JOIN 
       qry_BomLevel2_Comment ON (qry_BomLevel2_Rev.ChildID = qry_BomLevel2_Comment.ChildID) 
                             AND (qry_BomLevel2_Rev.ChildRevNr = qry_BomLevel2_Comment.ChildRevNr)
                             AND (qry_BomLevel2_Rev.XRefConfigurationID = qry_BomLevel2_Comment.XRefConfigurationID)) 
         ON (qry_BomLevel2_PartNo.XRefConfigurationID = qry_BomLevel2_Desc.XRefConfigurationID) 
         AND (qry_BomLevel2_PartNo.ChildRevNr = qry_BomLevel2_Desc.ChildRevNr)  
         AND (qry_BomLevel2_PartNo.ChildID = qry_BomLevel2_Desc.ChildID))

** 我在这里编辑了代码,因为当我尝试将其添加为答案时,它说它太长了。在这方面我会变得更好。感谢您的帮助,因为这让我起床并开始工作。

【问题讨论】:

【参考方案1】:

MS Access 用所有荒谬、无用的括号来制造噩梦。如果您将查询复制到文本编辑器中,例如免费的 Notepad++,它会突出显示开始和结束分隔符,这将使这样的工作变得更加容易。

我不知道这是否会做你想做的事,但它应该会清除你当前遇到的语法错误。

SELECT *
INTO tbl_Test
FROM
    (SELECT 
         qry_BomLevel1_PartNo.Type, qry_BomLevel1_PartNo.PartNo, 
         qry_BomLevel1_Desc.Description, qry_BomLevel1_Rev.Revision, 
         qry_BomLevel1_PartNo.Qty, qry_BomLevel1_Comment.Comment
     FROM 
         qry_BomLevel1_PartNo 
     LEFT JOIN 
         ((qry_BomLevel1_Desc 
     LEFT JOIN 
         qry_BomLevel1_Rev ON (qry_BomLevel1_Desc.XRefConfigurationID = qry_BomLevel1_Rev.XRefConfigurationID) 
                           AND (qry_BomLevel1_Desc.ChildRevNr = qry_BomLevel1_Rev.ChildRevNr) 
                           AND (qry_BomLevel1_Desc.ChildID = qry_BomLevel1_Rev.ChildID)) 
     LEFT JOIN 
         qry_BomLevel1_Comment ON (qry_BomLevel1_Rev.XRefConfigurationID = qry_BomLevel1_Comment.XRefConfigurationID) 
                               AND (qry_BomLevel1_Rev.ChildRevNr = qry_BomLevel1_Comment.ChildRevNr) 
                               AND (qry_BomLevel1_Rev.ChildID = qry_BomLevel1_Comment.ChildID)) 
          ON (qry_BomLevel1_PartNo.XRefConfigurationID = qry_BomLevel1_Desc.XRefConfigurationID) 
          AND (qry_BomLevel1_PartNo.ChildRevNr = qry_BomLevel1_Desc.ChildRevNr) 
          AND (qry_BomLevel1_PartNo.ChildID = qry_BomLevel1_Desc.ChildID)) --<--Add Closing paren here

    UNION ALL

    (SELECT --<--Add Opening paren here
        qry_BomLevel2_PartNo.Type, qry_BomLevel2_PartNo.PartNo, 
        qry_BomLevel2_Desc.Description, qry_BomLevel2_Rev.Revision, 
        qry_BomLevel2_PartNo.Qty, qry_BomLevel2_Comment.Comment
   FROM --<--Delete Opening paren here
        qry_BomLevel2_PartNo 
   LEFT JOIN 
       ((qry_BomLevel2_Desc 
   LEFT JOIN 
       qry_BomLevel2_Rev ON (qry_BomLevel2_Desc.ChildID = qry_BomLevel2_Rev.ChildID) 
                         AND (qry_BomLevel2_Desc.ChildRevNr = qry_BomLevel2_Rev.ChildRevNr) 
                         AND (qry_BomLevel2_Desc.XRefConfigurationID = qry_BomLevel2_Rev.XRefConfigurationID)) 
   LEFT JOIN 
       qry_BomLevel2_Comment ON (qry_BomLevel2_Rev.ChildID = qry_BomLevel2_Comment.ChildID) 
                             AND (qry_BomLevel2_Rev.ChildRevNr = qry_BomLevel2_Comment.ChildRevNr)
                             AND (qry_BomLevel2_Rev.XRefConfigurationID = qry_BomLevel2_Comment.XRefConfigurationID)) 
         ON (qry_BomLevel2_PartNo.XRefConfigurationID = qry_BomLevel2_Desc.XRefConfigurationID) 
         AND (qry_BomLevel2_PartNo.ChildRevNr = qry_BomLevel2_Desc.ChildRevNr)  
         AND (qry_BomLevel2_PartNo.ChildID = qry_BomLevel2_Desc.ChildID)
)

【讨论】:

我自己买了 Notepad++,这个工具会像你建议的那样非常有用。我尝试了你的建议并得到了同样的错误,但做了一些括号并让它工作。您如何在此处正确发布代码?我会发布最终有效的方法。 最简单的方法是在代码块的上方和下方放置一个带有三个反引号的行。 (键盘左上角的键。)如果您单击我的答案上的edit 按钮,它将向您显示带有反引号行的原始输入。一个单词或短语周围的一个反勾号会使它变灰,就像它在“编辑”中所做的那样。 我看到 marc_s 在您的问题中使用的另一种方法是将所有行缩进四个空格。

以上是关于使用 UNION ALL 查询在 FROM 子句中出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

UNION ALL、UNION与ORDER BY

sql 查询结果合并union all用法_数据库技巧

hive UNION和子查询

是否可以在 Union All BigQuery SQL 中让 where 子句引用另一个 where 子句?

Union All 的列数不匹配

.如何使用UNION子句,它必须符合哪两条基本准则?