2012-05-01 7 views
0

私は数千のレコードを持つテーブルを持っています。 重複したファーストネームを持つすべてのレコードを更新したい これを単一のクエリでどのように達成できますか? サンプルテーブルの構造:重複をカウントし、単一のクエリでテーブルを更新します。

Fname varchar(100) 
Lname varchar(100) 
Duplicates int 

この重複する列は、単一のクエリで重複の総数を更新する必要があります。 これはループで実行しないと可能ですか?

+2

いくつかのサンプルデータを表示できます<-->希望の出力? – eggyal

答えて

-1

これはできない場合があります。同じクエリで選択している同じテーブルを更新することはできません。

+0

はいできます。複数のテーブルの更新構文を自己結合で使用します([この回答](http://stackoverflow.com/a/10399092/623041)で行ったように)。 – eggyal

+0

http://dev.mysql.com/doc/refman/5.5/en/update.htmlから "現在、テーブルを更新してサブクエリ内の同じテーブルから選択することはできません。 – ethrbunny

+1

@ethrbunny自己結合ハックを使用していない場合はありません。それを使うなら、それは可能です。 –

0

最初の列を作成し、その後のようなクエリを記述します。

UPDATE table SET table.duplicates = (SELECT COUNT(*) FROM table r GROUP BY Fname/Lname/some_id) 

たぶん、この他には、SOのに役立ちますか?

How do I UPDATE from a SELECT in SQL Server?

+0

[現在、テーブルを更新してサブクエリ内の同じテーブルから選択することはできません。](http://dev.mysql.com/doc/refman/5.5/en/update.html) – eggyal

+0

エイリアスを使用するMSSQL 、 あなたはできる。 – dweiss

+1

素敵です。 :)しかし、質問は[タグ:mysql]タグが付いています。 – eggyal

2
update table as t1 
inner join ( 
select 
fname, 
count(fname) as total 
from table 
group by fname) as t2 
on t1.fname = t2.fname 
set t1.duplicates = t2.total 
+0

私のクエリは完全に機能します。 –

+0

謝罪!その制約に違反しているようだ。奇妙な。 – eggyal

+0

上記のクエリを試しましたが、結果を表示できませんでした。私は20万レコード近くあり、しばらくしてからぶら下がっていたので、私はそのプロセスを終了しなければならなかった。レコードを制限する方法はありますか?私はちょうど1000のレコードの上記のクエリをテストしたいと思います。 –

2

私は、数千人のレコードを持つテーブルを持っています。重複したファーストネームを持つすべてのレコードを更新したいのですが、どのようにしてこれを単一のクエリで実現できますか?

には、重複の数を保存してもよろしいですか?そうでない場合は、簡単なクエリです。

SELECT fname, COUNT(1) AS number FROM yourtable GROUP BY fname; 

なぜこの番号を保存するのかわかりません。別のレコードが挿入されたらどうなりますか?レコードが削除されたらどうなりますか? 「重複数」は同じままであるため、最初の突然変異では正しくなりません。

+0

真ですが、重複のリストを表示して、不要なものを削除したいとします。だから私はすべての重複を処理する場合、それは簡単になります。私は2週間に1回、この「重複のチェック」プロセスを実行している可能性があります。 –

+0

また、クエリは重複して表示されず、すべてのレコードが一覧表示されます。 –

+0

@KrishnaIyer - having句、すなわちHAVING COUNT(1)> 1を追加してみてください。しかし、最終的な目的が重複を削除する場合は、追加のロジックが必要です。 – Leigh

関連する問題