【问题标题】:The ntext data type cannot be selected as DISTINCT because it is not comparablentext 数据类型不能选择为 DISTINCT,因为它不可比较
【发布时间】:2016-01-04 07:30:46
【问题描述】:

如果我运行此查询,我有一个由多个查询和多个表连接的查询,我收到如下错误:

  1. text、ntext 和 image 数据类型无法进行比较或排序,除非使用 IS NULL 或 LIKE 运算符。
  2. ntext 数据类型无法选择为 DISTINCT,因为它不可比较。

表结构为:

查询是这样的:

SELECT p.Proj_uid, p.proj_name,p.Agency,p.District,p.Division,p.ProjStatus,Civilbill80.billcount as Civilbill80, 
Civilbill20.billcount as Civilbill20 ,Civilbillpay.billcount as FinalCivilBill,CivilWorkslip.billcount as CivilWorkslip,
 Electribill80.billcount as Electricbill80, Electribill20.billcount as Electricbill20, Electribillpay.billcount as FinalElectriBill,
 ElectriWorkslip.billcount as ElectriWorkslip  FROM tempproj p
  LEFT JOIN (
             SELECT distinct(Proj_name),BillType,COUNT(1) as billcount  FROM payment_80   where BillType='CIVIL'
              GROUP BY Proj_name, BillType ) Civilbill80 ON Civilbill80.Proj_name = p.proj_name 
 LEFT JOIN (
             SELECT distinct(Proj_name),billtype,COUNT(1) as billcount FROM Payment_20    where billtype='CIVIL'
              GROUP BY Proj_name, billtype ) Civilbill20 ON Civilbill20.Proj_name = p.proj_name 
 LEFT JOIN (
             SELECT distinct(Proj_name),BillType, COUNT(1) as billcount  FROM payment_80  where BillType='Electric'
              GROUP BY Proj_name, BillType  ) Electribill80 ON Electribill80.Proj_name = p.proj_name 
 LEFT JOIN (
             SELECT distinct(Proj_name),billtype, COUNT(1) as billcount  FROM Payment_20  where billtype='Electric'
              GROUP BY Proj_name, billtype ) Electribill20 ON Electribill20.Proj_name = p.proj_name 
 LEFT JOIN (
             SELECT distinct(Proj_name),billtype, COUNT(1) as billcount   FROM Payment  where billtype='CIVIL'
              GROUP BY Proj_name, billtype ) Civilbillpay ON Civilbillpay.Proj_name = p.proj_name 
 LEFT JOIN (
             SELECT distinct(Proj_name),billtype, COUNT(1) as billcount  FROM Payment  where billtype='CIVIL'
              GROUP BY Proj_name, billtype  ) Electribillpay ON Electribillpay.Proj_name = p.proj_name
LEFT JOIN (
             SELECT distinct(proj_uid),item_type, COUNT(1) as billcount  FROM WorkSlipAmounts where item_type='WorkSlip'
              GROUP BY proj_uid, item_type ) CivilWorkslip ON CivilWorkslip.proj_uid = p.proj_uid
 LEFT JOIN (
             SELECT distinct(proj_uid),item_type, COUNT(1) as billcount  FROM WorkSlipAmounts  where item_type='ElecWorkSlip'
              GROUP BY proj_uid, item_type) ElectriWorkslip ON ElectriWorkslip.proj_uid = p.proj_uid

请帮帮我。 非常感谢你

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    SQL Server 的 ntext, text, and image 数据类型已过时:

    ntext、text 和 image 数据类型将在未来版本中删除 Microsoft SQL Server 的。 避免在新版本中使用这些数据类型 开发工作,并计划修改当前使用的应用程序 他们。请改用 nvarchar(max)、varchar(max) 和 varbinary(max)。

    可能的解决方案:

    1. 识别使用这些数据类型的列

    2a。 (正确方式)更改表并将数据类型更改为NVARCHAR/VARBINARY

    2b。 (解决方法)或在SELECT DISTINCT 中使用:CAST(col_name AS NVARCHAR(MAX)), 像CAST(p.proj_name AS NVARCHAR(MAX)) = CAST(Civilbill20.proj_name AS NVARCHAR(MAX))这样的连接条件也一样

    【讨论】:

    • 是的,我试过了,但我已经加入了多个表,所以我将表名作为 p.proj_name 的前缀,所以它向我显示 p 中的错误。如果我删除 p。并编写一个简单而单一的查询,我得到了答案,但我需要通过匹配来加入表格,例如:p.proj_name =Civilbill20.proj_name。
    • @habeeb CAST(p.proj_name AS NVARCHAR(MAX)) = CAST(Civilbill20.proj_name AS NVARCHAR(MAX))
    • 我需要转换表中的所有行还是只转换匹配的行
    • 你需要转换所有的出现。如果可能的话,改变表格会容易得多。
    • 你能写出至少3张表的查询吗
    【解决方案2】:

    修复不良设计。

    在您的链接表设计中,所有 ntext 字段都是 - NAMES。严重地?项目名称最大 4gb?

    为长度指定一个合理的限制,然后将其更改为 NVARCHAR(x)(作为长度)。

    完成此操作后,请修复错误的编程。项目名称必须是唯一的。如果您正确地制定查询,则不需要(非常昂贵 - 速度慢)不同的开始。

    最后,这归结为 2 个初学者错误:

    • 糟糕的表格设计,使用大型文本数据类型来保存短信息。
    • 错误的查询设计包含不需要的 Distinct 子句。

    在您的情况下,甚至看起来所有不同在逻辑上都没有意义,因为由于分组依据,数据已经是不同的。

    【讨论】:

    • 是的,我会删除那个独特的,但我不能改变设计,因为这是一个巨大的项目,如果我做了改变,那么我必须再次解决问题,这将需要很多时间......现在该项目工作正常,只有我需要介绍该查询并且我需要显示记录
    • 好吧,告诉你它是怎么回事:如果我看到这样的桌子设计,我会改变它。不仅是设计——我会改变制作它的人,并解雇那些认为使用 NTEXT 作为项目名称有意义的人。解释:无能。这是核心问题。您甚至不能在其中放置唯一索引(并且您需要它们来保证唯一命名)。设计已损坏。
    • 非常感谢@TomTom ...这是我的前辈完成的...现在让我头疼
    • 把它们指向这里。 BLOB / 大数据字段的使用应该是最后的手段——绝对不适合短元素。它们削减了很多功能并且本质上更慢。上面有人在做他不适合的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多