0

私は2つのテーブルを持っています

Customers:

id,
CustomerName

テーブルCustomerMapping

ID
WrongName,
CorrectedName

私がやりたいことは:

TableCustomers.CustomerName = TableCustomerMapping.WrongName の場合、TableCustomerMapping.CorrectName で TableCustomers.CustomerName を更新します

この更新ステートメントを試しましたが、クエリをあきらめてキャンセルするまでに時間がかかりすぎます (6 分以上)。1000 行を更新するのにそれほど時間をかけるべきではありません。

これが私が試していた Update ステートメントです。何か不足していますか?

UPDATE i
SET i.CustomerJob = c.CorrectedName
FROM dbo.TableCustomers i
LEFT JOIN dbo.CustomerMapping c ON (i.CustomerJob = c.WrongName);
GO
4

5 に答える 5

2

問題は、文字列を比較していることです。文字列列にインデックスがない可能性が高いため、テーブル 'TableCustomers' のすべての行に対して、クエリは 'CustomerMapping' でテーブル スキャンを実行する必要があります。クエリ オプティマイザーがテーブル スキャンを回避し、パフォーマンスを犠牲にすることなく必要なデータを見つけるには、WrongName フィールドの CustomerMapping にインデックスを追加する必要があります。そのため、インデックスを作成します (データ セットが非常に大きい場合、時間がかかる場合があります)。よくわかりませんが、サブクエリを実行して、クエリを支援するために WrongName でデータを並べ替えることができるかもしれません...しかし、最善の策はインデックスです。

于 2012-12-21T17:14:55.780 に答える
2

これらの 2 つのテーブルがc.CustomerName = m.WrongName.

にも注意してくださいthere could be more than one person with same wrong name & correct name。状況 ( not related by IDs) を考えると、次の ( INNER JOIN or JOIN) でうまくいくと思います。

--Do this select first for safety
select c.CustomerName, m.CorrectedName
from TableCustomers c join TableCustomerMapping m on c.CustomerName = m.WrongName

--Update if okay
update c
set c.CustomerName = m.CorrectedName
from TableCustomers c join TableCustomerMapping m on c.CustomerName = m.WrongName
于 2012-12-21T17:09:38.863 に答える
2

LEFT JOIN... を実行しないでください。そうすると、Customersテーブル内のすべてのレコードが更新され、一致しないすべてのレコードがNULL... に設定されます。代わりに、次の操作を行いますINNER JOIN

UPDATE c
SET c.CustomerName = cm.CorrectedName
FROM dbo.Customers c
INNER JOIN dbo.CustomerMapping cm ON (c.CustomerName = cm.WrongName);
于 2012-12-21T17:11:23.900 に答える
0

やりたいことはわかります。この例を試してください:

UPDATE TABLEA
 SET b = TABLEB.b1,
     c = TABLEB.c1,
     d = TABLEB.d1
 FROM TABLEA, TABLEB
 WHERE TABLEA.a = TABLEB.a1
 AND TABLEB.e1 > 40
 GO

私はあなたが働くことを願っています

于 2012-12-21T17:08:00.377 に答える
0

おそらく、外部キーを TableCustomerMapping に追加できます

**TableCustomerMapping**
___________________
ID,
fkCustomerID,
WrongName,
CorrectedName

次に、それを使用して2つのテーブルを結合すると、1つのレコードのみが更新されます

UPDATE i
SET i.CustomerJob = c.QBName
FROM dbo.TableCustomers i
LEFT JOIN dbo.CustomerMapping c ON (i.ID= c.fkCustomerID);
GO
于 2012-12-21T17:00:19.273 に答える