0

我正在尝试使用 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'

返回的记录

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

4

4 回答 4

2

“不同”,在你的上下文中,你试图在所有列上做不同的。也就是说,有些数据类型是不可转换的,例如 TEXT。因此,如果您的表存在一些非“可区分”列类型,那就是导致查询崩溃的原因。

但是,要解决此问题,如果您执行类似的操作

CONVERT( char(60), YourTextColumn ) as YourTextColumn,

它应该为您提供...至少它现在认为最终列类型是“字符”角色并且可以对其进行比较。

于 2013-02-11T17:19:47.037 回答
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
于 2013-02-11T17:18:24.250 回答
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 是否允许重复(无法想象为什么会这样)。

于 2013-02-11T19:32:53.540 回答
0

您应该检查表中列的数据类型address。我的猜测是其中一个或多个具有文本、ntext 或图像数据类型。

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

值得一提的是,有关ntext、text 和 image (Transact-SQL)的 MSDN 文章建议避免使用这些数据类型并改用 nvarchar(max)、varchar(max) 和 varbinary(max)。您可能需要考虑更改该表的定义方式。

于 2013-02-11T17:20:34.897 回答