0

2005 MS-SQL データベースからレコードを選択しようとすると問題が発生します (SQL はまだ初心者ですが、w3schools から基本的なコマンドを学習して使用しています)。理論的には、すべての製造元レコードは一意である必要があります。少なくとも、最初に大量のデータをダンプしたときは、そうするつもりでした。残念ながら、そうではありません。今すぐ修正する必要があります。これが私のシナリオです:

Table name = ItemCatalog
Relevant columns = Partnumber,Manufacturer,Category

私がSELECT DISTINCT Manufacturer FROM ItemCatalogこの小さな問題をしたとき、何が起こったのですか:

Cables2Go
CablesToGo
ケーブル トゥ ゴー
CableToGo Inc
CablesToGo Inc

それらの5つすべてが、それらが何であるかが明確に示されました。私の SELECT ステートメントがそれを返すことを非難することはできませんが、私の人間の観点からは、それらはすべて同じメーカーです! UPDATE コマンドを実行し、表示されるすべての順列を修正する方法が有効だと思いますが、多くのメーカーがあり、これには非常に時間がかかります。

SELECT ステートメントを打ち込むときに、メーカー名 (または実際には任意のフィールド) のすべての可能性のある順列を見つける方法はありますか? LIKE 演算子を試したので、ステートメントは次のようになります

SELECT Manufacturer FROM ItemCatalog WHERE Manufacturer LIKE '%CablesToGo%'

しかし、それは私が望んでいたほどうまくいきませんでした。ここに厄介な点があります。私がまとめている他のプログラムでは、5 つのバリエーションすべてではなく、単一のメーカー名のみを要求する必要があります。多分私はここで輪になって話しているのかもしれませんが、1つのステートメントで同様の文字列を見つける簡単な方法はありますか?

4

6 に答える 6

3

データ マイニングを行っている場合は、SQL Server でSOUNDEXand関数を試すこともできます。DIFFERENCE

どちらも時代遅れですが (外国語の文字をうまく処理できません)、興味深い結果が得られる可能性があります。

SELECT * FROM ItemCatalog WHERE SOUNDEX(Manufacturer) = SOUNDEX('Cables To Go');

SELECT * FROM ItemCatalog WHERE DIFFERENCE(Name, 'Cables To Go') >= 3;

数字の 3 は似ている可能性が高いことを意味します (0 は似ていないことを意味し、4 は非常に似ていることを意味します)。

SOUNDEXインターネット上で利用可能なより良い機能がいくつかあります。例については、 Tek-Tipsを参照してください。

SQL Teamの別の例を次に示します。

于 2009-09-07T03:15:02.403 に答える
0

選択肢の 1 つは、ワイルドカード検索を のように緩めることです'Cables%Go%'。これは短期的には良いことかもしれませんが、このアプローチでは、必要以上に多くのメーカーをマッチングするリスクがあります (つまり、Cables on the Go など)。

また、Cables To Go のすべてのバリアントを 1 つのグループにまとめて、アプリが ItemCatalog クエリに対してクエリおよび正規化できるマッピング テーブルを作成することもできます。

もう 1 つのオプションは、Manufacturers テーブルを導入することです。この ItemCatalog テーブルは、このテーブルへの外部キーを持ち、Manufacturer テーブルにあるメーカーのみを許可します。これを機能させるには、ItemCatalog テーブルをクリーンアップする必要があります。Cables to Go のすべてのバリアントを同じにする必要があると仮定します。

于 2009-09-07T02:58:08.880 に答える
0

他の人がクエリの修正を提案していることは知っています。キックの長期的な修正について詳しく説明したいと思います。

各バリエーションを 1 つのメーカー エンティティに関連付ける別のテーブルを作成できます。仕事でこのような状況に遭遇した場合 (実際に遭遇した場合)、私はそれを修正したくなるでしょう。

主キー、名前などでメーカーのテーブルを作成します。

エイリアスを使用してテーブルを作成します。これらは、製造元の ID を持たないデータ (インポート ファイルなど) が表示された場合にのみ必要になります。

製造元テーブルの主キー (つまり、ManufacturerID 外部キー) を参照するように ItemCatalog を変更します。

データを ItemCatalog にインポートする場合、一致に基づいて ManufacturerID 外部キーをエイリアス テーブルに割り当てます。2 つ以上のレコードに一致する名前がある場合は、それらにフラグを立てて手動で確認するか、複数のメーカー名で一致させようとします。

于 2009-09-07T02:51:28.797 に答える
0

'Cable%Go%' はその 1 つのケースで機能する可能性がありますが、他の文字列に別のバリエーションがある場合は、多くの手動データ クリーンアップを実行する必要があります。

于 2009-09-07T02:52:04.993 に答える
0

標準 SQL には、LIKE よりも少し強力な SIMILAR ステートメントがあります。

ただし、次のように LIKE を使用すると効果的です。

Manufacturer LIKE 'Cable%Go%'

これは、リストされているすべてのバリアントを見つけて、この特定のケースで機能します。ただし、「Cable TV Gorgons」も検出されるため、おそらくそれらを含める必要はありません。あなたのバージョンでは、'We Hate CablesToGo With Ferocity Inc' も見つかりますが、これもおそらく望まないでしょう。

しかし、データクレンジングは大きな問題であり、データクレンジングを提供することで生計を立てている企業もあります。多くの場合、用語 (ここでは会社名) の辞書またはシソーラスを作成して、遭遇したすべての変形を正規の形式にマッピングすることになります。問題は、同じ異体字の綴りが 2 つの別々の正規形に使用されている場合があることです。たとえば、明るいスパークのペアは両方とも「C2G」を略語として使用することを決定する場合がありますが、一方は「Cables To Go Inc」に使用し、もう一方は「Computers To Gamers Inc」に使用します。「C2G」の特定のインスタンスが「ケーブル」または「コンピュータ」を意味するかどうかを判断するには、他の情報を使用する必要があります。

于 2009-09-07T02:52:58.580 に答える
0

オブジェクト リレーショナル マッピング ツールを使用してテーブルをオブジェクトにマップし、そこにフィルタリング ロジックを追加することをお勧めします。

于 2009-09-07T02:54:15.470 に答える