4

Netezzaは主キーの制約チェックをサポートしていないことが判明したため、テーブルに重複するレコードがいくつかあります。そうは言っても、情報がまったく同じであるレコードがいくつかあり、そのうちの1つだけを削除したいと思います。やってみた

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

このクエリによって削除されるレコードを制限する方法はありますか?レコードを削除して再挿入するだけでよいことはわかっていますが、これを複数回行う必要があるため、少し面倒です。

これはSQLServerまたはMySQLではないことに注意してください。これはNetezza用です。

4

6 に答える 6

4

「DELETETOP1」または「LIMIT」キーワードのいずれかをサポートしていない場合は、次のいずれかを実行する必要があります。

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

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

それがお役に立てば幸いです。お知らせください。

そして将来の参考のために; これが、私がこれまで使用するとは思わない場合でも、私が常に自動インクリメントIDフィールドを作成する理由です。:)

于 2011-10-28T18:10:35.160 に答える
3

以下のクエリは、テーブルから重複を削除するために機能します。

DELETE FROM YOURTABLE 
WHERE COLNAME1='XYZ' AND 
(
COLNAME1,
ROWID
)   
NOT IN
(
SELECT COLNAME1,
       MAX(ROWID)
FROM YOURTABLENAME
WHERE COLNAME = 'XYZ'
GROUP BY COLNAME1
)
于 2011-11-17T21:44:26.047 に答える
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

サブクエリを作成して、COUNT(*)> 1のすべてのtest_idを選択し、手順1と3で重複を自動的に見つけることもできます。

于 2011-10-29T10:08:33.447 に答える
1
  -- remove duplicates from the <<TableName>> table
  delete from <<TableName>> 
  where rowid not in 
  (
    select min(rowid) from <<TableName>>
    group by (col1,col2,col3) 
  );
于 2012-05-20T16:15:21.507 に答える
0

GROUP BY 1,2,3、....、nは、一時テーブルへのインサートの重複を排除します

于 2011-11-13T11:24:41.547 に答える
-1

Netezzaでrowidの使用は許可されていますか...私の知識に関する限り、このクエリはNetezzaで実行されるとは思いません...

于 2013-06-05T07:02:06.293 に答える