0

http://sqlfiddle.com/#!6/5ac78/1

そのフィドルが機能するかどうかはわかりません。CHARINDEX の結合からコード 2 を返したい。

別の例として、次のような説明テーブル (dt) があります。

ID      Description                         Code
158     INTEREST                            199
159     INTEREST PAID                       383
160     INTEREST PAYABLE ON     ACCOUNT     384

そして、次のようなエントリを持つマスター テーブル (mt):

ID      Narrative                       Code
1       INTEREST PAID                   NULL

マスター テーブルのコードを 383 に設定する必要があります。CHARINDEX(dt.Description, mt.Description) > 0 を使用して JOIN に基づいて INSERT を実行すると、毎回 mt.Code が 199 に設定されます。

マスター テーブルを更新して、最初に一致したインスタンスだけでなく、最も一致するコードを説明テーブルから取得するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

1

単純な JOIN を使用して LEFT JOIN との一致を見つけ、最長の一致以外をすべて排除することができます。

UPDATE t1 
SET t1.codeA = t2_1.codeB
FROM table1 t1
JOIN table2 t2_1      
  ON CHARINDEX(t2_1.colB, t1.colA) > 0
LEFT JOIN table2 t2_2 
  ON CHARINDEX(t2_2.colB, t1.colA) > 0
 AND t2_1.codeB <> t2_2.codeB 
 AND LEN(t2_2.colB) > LEN(t2_1.colB)
WHERE t2_2.colB IS NULL;

でテストする SQLfiddle

このようなクエリ(または元のクエリ)でインデックスを使用することは(おそらく)不可能であるCHARINDEXため、大量のデータに対してクエリが非常に遅くなる可能性があることに注意してください。

また、本番データでインターネット上のランダムな人々からのSQL更新を実行する前に、常に最初にテストしてください:)

于 2014-02-19T05:23:55.210 に答える