SQL Server明显没有正确使用

时间:2013-02-11 17:08:13

标签: sql sql-server

我正在尝试使用SQL Server只选择一个帐户,但收到以下错误:

  

错误:无法将文本数据类型选为DISTINCT,因为   它没有可比性。错误代码:421

使用以下声明:

select DISTINCT ad.*,
       acc.companyname,
       acc.accountnumber
from address ad 
join AddressLink al on al.AddressID = ad.id
join account acc on acc.ID = al.ParentID 
where acc.accountnumber like '11227'

我做错了什么?

编辑:

新查询:

select address.ID,
       address.StreetAddress1,
       address.StreetAddress2,
       address.City,
       Address.State,
       Address.PostalCode,
       Address.ClassTypeID,
       account.companyname,
       account.accountnumber,
       addresslink.ID as addressLinkID,
       addresslink.addresstypeid
from address 
join AddressLink on address.id = addresslink.AddressID 
join account  on  addresslink.ParentID = account.ID 
where account.CompanyName like 'company name'

returned records

我必须模糊的所有公司名称都是相同的。

4 个答案:

答案 0 :(得分:2)

尝试:

select ad.*,
       l.companyname,
       l.accountnumber
from address ad 
join (select DISTINCT al.AddressID,
                      acc.companyname,
                      acc.accountnumber
      from account acc 
      join AddressLink al on acc.ID = al.ParentID 
      where acc.accountnumber like '11227') l
on l.AddressID = ad.id

答案 1 :(得分:2)

“Distinct”,在您所拥有的上下文中尝试对所有列进行区分。也就是说,有些数据类型无法转换,例如TEXT。因此,如果您的表中存在某些非“可区分”列类型,则会导致查询崩溃。

然而,要解决这个问题,如果你做了类似

的事情
CONVERT( char(60), YourTextColumn ) as YourTextColumn,

它应该为你得到...至少它现在认为最后的列类型是“char”acter并且可以比较它。

答案 2 :(得分:0)

您应该检查address表中列的数据类型。我的猜测是它们中的一个或多个具有数据类型text,ntext或image。

使用text,ntext或image数据类型的一个限制是,这些数据类型定义的列不能用作包含DISTINCT子句的SELECT语句的一部分。

对于它的价值,ntext, text, and image (Transact-SQL)的MSDN文章建议避免使用这些数据类型,而是使用nvarchar(max),varchar(max)和varbinary(max)。您可能需要考虑更改该表的定义方式。

答案 3 :(得分:0)

Mark B接受的答案显示了AddressLink.AddressId,Account.CompanyName和Account.AccountNumber的子查询(限制DISTINCT域的好主意)。

让我问一下:AddressLink是否允许多条记录在ParentId和AddressId字段中具有相同的值?

如果没有,并假设Mark B的答案有效,那么只需删除DISTINCT,因为你永远不会在该子查询中得到任何重复。

离开DISTINCT会导致性能下降,因为数据库必须创建一个临时表,该表使用btree或散列索引,并且必须将子查询返回的每个值插入到该表中以检查它是否使这三个领域的唯一性约束。请注意,“优化器”不知道不会有任何欺骗...如果你告诉它检查DISTINCT,它会检查它...使用btree索引这将导致O(n log) n)处理返回的行数;使用哈希值会导致O(n)工作,但是谁知道常量因子与你正在做的其他工作有多大(它可能比你正在做的其他事情都要大,这意味着这可以使这个运行快一半没有DISTINCT)。

所以我的答案是Mark B在子查询中没有DISTINCT的答案。让我知道AddressLink是否允许重复(无法想象为什么会这样)。