2011-10-28 8 views
3

Netezzaが主キーの制約チェックをサポートしていないことが判明したため、テーブルに重複レコードがいくつかあります。つまり、私は情報がまったく同じで、そのうちの1つだけを削除したいという記録をいくつか持っています。私はどちらのオプションが機能しかしSQLでいくつかの基準に一致するレコードを1つ削除するにはどうすればよいですか? (Netezza)

delete from table_name where test_id=2025 limit 1 

とも

delete from table_name where test_id=2025 rowsetlimit 1 

をやってみました。

found 'limit'. Expecting a keyword 

このクエリで削除されたレコードを制限する方法はありますか?私はちょうどレコードを削除して、それを再び挿入することができますが、私はこれを何度もやらなければならないので少し面倒です。

これは、SQL ServerまたはMySQL.Thisではないことに注意してください、それがサポートするいずれか、または「LIMIT」キーワード「TOP 1の削除」されない場合は、あなたが持っ終わる可能性がありネティーザため

答えて

3

です次のいずれかを実行します。

1)自動インクリメント列(IDなど)を追加して、各行を一意にします。しかし、テーブルが作成された後にNetezzaでそれを実行できるかどうかはわかりません。

2)プログラミング言語でテーブル全体をプログラムで読み込み、プログラムで重複を排除してから、すべての行を削除して再度挿入します。これは、他のテーブルによる参照である場合は不可能かもしれません。その場合は、一時的に制約を削除する必要があります。

私は役立つことを願っています。お知らせください。

今後の参考として、これはなぜ私が個人的に私はそれを使用するとは思わない場合でも、自動インクリメントIDフィールドを作成する理由です。 :)レコードが同じであれば

+0

...限り私の知識は、私はこのクエリはNetezzaの中で実行されないと思います関心事であるとして...ネティーザで許可されています。私は悪いニュースが好きではないが、私はメッセンジャーを責めることはできないと思う。ありがとう。 – Rondel

1

は、あなたが

CREATE TABLE DUPES as 
SELECT col11,col2,col3,col....... coln from source_table where test_id = 2025 
group by 
1,2,3..... n 

DELETE FROM source_table where test_id = 2025 

INSERT INTO Source_table select * from duoes 

DROP TABLE DUPES 

のような何かができるあなたも、自動的にdupesを見つけるために、COUNT(*)> 1を持つすべてのtest_idsを選択するには、サブクエリを作成することもできますステップ1および3

+0

これは新しいテーブルに重複を挿入して元のテーブルに重複を挿入するだけではありませんか?アイデアの基本は好きです – Rondel

0

GROUP BY 1,2,3、...、N一時テーブルへの挿入にdupesを排除する

D.

3

以下のクエリはDELEのために働きますテーブルから重複を削除します。

DELETE FROM YOURTABLE 
WHERE COLNAME1='XYZ' AND 
(
COLNAME1, 
ROWID 
) 
NOT IN 
(
SELECT COLNAME1, 
     MAX(ROWID) 
FROM YOURTABLENAME 
WHERE COLNAME = 'XYZ' 
GROUP BY COLNAME1 
) 
1
-- remove duplicates from the <<TableName>> table 
    delete from <<TableName>> 
    where rowid not in 
    (
    select min(rowid) from <<TableName>> 
    group by (col1,col2,col3) 
); 
-1

使用ROWIDは、このことができます

関連する問題