ntext数据类型不能被选为DISTINCT,因为它不具有可比性

时间:2016-01-04 07:30:47

标签: sql sql-server

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

  
      
  1. 除非使用IS NULL或LIKE运算符,否则无法比较或排序text,ntext和image数据类型。
  2.   
  3. 无法将ntext数据类型选为DISTINCT,因为它无法比较。
  4.   

表结构是: Design of tables and datatype

,查询是这样的:

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

enter image description here

请帮帮我。 非常感谢你

2 个答案:

答案 0 :(得分:8)

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

  

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

可能的解决方案:

  1. 标识使用这些数据类型的列
  2. 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))

    等加入条件相同

答案 1 :(得分:0)

修复糟糕的设计。

在链接表设计中,所有ntext字段都是 - NAMES。真的吗?项目名称最多4gb?

为长度分配合理的限制,然后将其更改为NVARCHAR(x)(长度)。

完成此操作后,修复错误的编程。项目名称必须是唯一的。如果你正确地表达你的查询,就不需要开始(非常昂贵 - 如同很慢)。

最后这会导致2个初学者错误:

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

在你的情况下,它甚至看起来像所有的不同在逻辑上没有意义,因为数据已经是不同的归功于group by。