0

SQL Serverを使用してアカウントを1つだけ選択しようとしていますが、次のエラーが発生します。

エラー:テキストデータ型は比較できないため、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

試す:

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 に答える
2

「個別」とは、すべての列で個別に実行しようとしているコンテキストです。とはいえ、TEXTなど、変換できないデータ型がいくつかあります。したがって、テーブルにこれらの「区別できない」列タイプがいくつか存在する場合、それがクエリをクラッシュさせます。

しかし、これを回避するために、あなたが次のようなことをするなら

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

それはあなたのためにそれを得るはずです...少なくとも、最終的な列タイプは「char」acterであると考えており、それを比較することができます。

于 2013-02-11T17:19:47.037 に答える
0

表の列のデータ型を確認する必要がありaddressます。私の推測では、それらの1つ以上がデータ型text、ntext、またはimageを持っていると思います。

text、ntext、またはimageデータ型を使用する際の制限の1つは、これらのデータ型で定義された列を、DISTINCT句を含むSELECTステートメントの一部として使用できないことです。

ntext、text、およびimage(Transact-SQL)に関するMSDNの記事では、これらのデータ型を避け、代わりにnvarchar(max)、varchar(max)、およびvarbinary(max)を使用することを推奨しています。そのテーブルの定義方法を変更することを検討することをお勧めします。

于 2013-02-11T17:20:34.897 に答える
0

マークBから受け入れられた回答は、AddressLink.AddressId、Account.CompanyName、およびAccount.AccountNumberのサブクエリ(DISTINCTのドメインを制限することをお勧めします)を示しています。

これを聞いてみましょう:AddressLinkでは、ParentIdフィールドとAddressIdフィールドに複数のレコードが同じ値を持つことができますか?

そうでない場合で、Mark Bの答えが機能すると仮定すると、そのサブクエリ内で重複を取得することは決してないため、DISTINCTを削除するだけです。

DISTINCTをそのままにしておくと、DBがbtreeまたはハッシュでインデックス付けされた一時テーブルを作成する必要があり、サブクエリによって返されたすべての値をそのテーブルに挿入して、一意性制約が無効になるかどうかを確認する必要があるため、パフォーマンスが低下します。これらの3つのフィールド。「オプティマイザー」は、重複がないことを認識していないことに注意してください... DISTINCTをチェックするように指示すると、チェックされます... btreeインデックスを使用すると、O(n log n)返された行数を処理します。ハッシュを使用すると、O(n)が機能しますが、実行している他の作業と比較して定数係数がどれほど大きいかは誰にもわかりません(おそらく、実行している他のすべての作業よりも大きいため、実行速度が半分になる可能性があります) DISTINCTなしのように)。

したがって、私の答えは、サブクエリにDISTINCTがないMarkBの答えです。AddressLinkが繰り返しを許可するかどうかを教えてください(なぜそうなるのか想像できません)。

于 2013-02-11T19:32:53.540 に答える