delphi程序中使用union all 查询sql数据中的两个表报"不能比较或排序 text、ntext和image类型"的错误。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi程序中使用union all 查询sql数据中的两个表报"不能比较或排序 text、ntext和image类型"的错误。相关的知识,希望对你有一定的参考价值。

查询的字段检查过了都不是这三个类型的。也没有排序,但是我发现使用union就不会报错,union和union all有啥区别呢?哪个是有默认的排序啊?

text与ntext及image类型是不能使用索引的,因此,在使用UNION时,里面的字段不能为上述类型。追问

查询的字段检查过了都不是这三个类型的。

追答

union和union all的区别只是系统会自动把重复的元数据去掉与否的关系。。

加上ALL 意思是不去掉,不加就是去掉

参考技术A select字段中 ,去掉 text,ntext,或者image类型的字段,这些字段ms sql不支持union.追问

查询的字段检查过了都不是这三个类型的。

追答

那你先排除有问题的字段吧,如果select字段不多的话,删除一部分字段,知道sql语法正确。

追问

试了还是不行,把union all改成union 就不会报这个错误了。晓得这是怎么回事儿不?

参考技术B 或者将TEXT转换成varchar追问

查询的字段检查过了都不是这三个类型的。

追答

那是不是有Order by或者Group By 啊

追问

没有。

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

【中文标题】使用 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 在您的问题中使用的另一种方法是将所有行缩进四个空格。

以上是关于delphi程序中使用union all 查询sql数据中的两个表报"不能比较或排序 text、ntext和image类型"的错误。的主要内容,如果未能解决你的问题,请参考以下文章

Mysql联合查询UNION和UNION ALL的使用介绍

union all这样写为啥提示“使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有

Mysql联合查询UNION和UNION ALL的使用介绍

Mysql联合查询UNION和UNION ALL的使用介绍

mysql中union与union all的区别

sql中Union和union all的使用