2011-11-10 6 views
1

mysqlの単純な削除のように思っていますが、何か問題があります。私はこれをしたい:更新の対象テーブルを指定できません。mysqlでクエリを削除します。

delete from table where col_name not in (select distinct col_name from table); 

このテーブルには一意のキーがありません。私はこれをしようとすると、私はエラーを取得:

You can't specify target table for update in from clause; ErrorNr. 1093

MySQLのコミュニティ5.1

は、私はこのクエリからの出力を保存することができます方法はあります - 一時に>

select distinct col_name from table; 

。テーブルとそれを削除クエリで使用する?

+0

重複を削除しますか?右?その後、一意のキーを追加する必要があります。 – Devart

+0

クエリが意味をなさない場合、すべての列の値は返された別の 'col_name'のリストになります。 – Harry

答えて

3

エイリアスを使用する必要があります。

delete from table where col_name not in (select a.col_name from (select distinct col_name from table) a); 

これは動作するはずです。

編集:申し訳ありませんが、私は疑問を誤解し、SQLエラーのみに焦点を当てています。一意のキーを持たない重複行を削除するという問題は、上記の要求では答えられません。

+0

私はこの正確な構文を使用し、エラーはありませんが、何も削除されません。つまり、テーブルは変更されずにエントリが残っています。私は 重複したエントリが存在することを確認します: 'select col_name by table group from col_name count(*)> 1;' –

+0

select a.col_name from(テーブルから異なるcol_nameを選択)a目的の行を返します。編集:あなたのケースでは、チェックa.col_nameから選択してください((*)> 1)戻り値何かを持つcol_nameでテーブルグループからcol_nameを選択します。そうでない場合は、内部クエリをチェックします。 – Molochdaa

+0

ありがとうございました。「a.col_nameを選択してください(選択したcol_nameからcol_nameをcount(*)> 1)a 'に変更し、削除したい行を返しました。 this - > 'テーブルからcol_nameを選んで削除する(a.col_nameを選択してください(count(*)> 1を持つcol_nameでテーブルグループからcol_nameを選択してください))a)'私がまだあなたが提案した最初のことがうまくいかなかった理由はまだわかりません... –

0

@Molochdaaの回答が間違っています

説明。 が、これは、テーブル

col_name | value 
------------------ 
east  | 10 
west  | 15 
east  | 10 
west  | 15 
north | 5 
east  | 10 
north | 5 

であると仮定しTABLE_NAMEから明確なCOL_NAMEを選択できます:あなたはdelete from table where col_name not in (...)を書くとき、今、その後何の行はすべての列として返されません

col_name 
------------------ 
east  
west  
north  

は、返されたリスト

であります正解は(@jeffery_the_windによって提案される)

delete from table where col_name in (
    select a.col_name from (
     select col_name from table group by col_name having count(*)>1 
    ) a 
) 

もっと簡単な別の答え

delete from table_name 
     where rowid not in (select min(rowid) 
          from Table_name 
          group by column1..,column2,...column3..) 
関連する問題