7

同じデータが誤って 2 回挿入されたテーブルがあり、ほとんどの (すべてではない) 行がテーブルに 2 回表示されます。簡単に言えば、行の 1 つのバージョンを削除し、もう 1 つのバージョンを保持する SQL ステートメントが必要です。それらは同一であるため、どのバージョンが削除されてもかまいません。

テーブル構造は次のようなものです。

FID、unique_ID、COL3、COL4....

Unique_IDは主キーです。つまり、それぞれが 1 回だけ表示されます。 FIDは各機能に固有のキーであるため、複数回表示される場合は重複を削除する必要があります。

重複する機能を選択するには、次のようにします。

select count(*) from TABLE GROUP by FID

残念ながら、そこから余分な行を削除してそれぞれを 1 つだけ残す SQL delete ステートメントに移行する方法がわかりません。

この種の質問は以前に尋ねられ、distinct で create table を試しましたが、名前を付けずにすべての列を取得するにはどうすればよいですか? これは単一の列 FID のみを取得し、保持するすべての列を項目化すると、次のようになります。ORA-00936: missing expression

CREATE TABLE secondtable NOLOGGING as select distinct FID from TABLE

4

5 に答える 5

9

どの行が保持されているか気にしない場合

DELETE FROM your_table_name a
 WHERE EXISTS( SELECT 1
                 FROM your_table_name b
                WHERE a.fid = b.fid
                  AND a.unique_id < b.unique_id )

それが完了したら、FID一意であることを保証する制約をテーブルに追加する必要があります。

于 2012-05-10T15:38:24.443 に答える
4

これを試して

DELETE FROM table_name A WHERE ROWID > (
SELECT min(rowid) FROM table_name B
WHERE A.FID = B.FID)
于 2012-05-10T15:38:57.220 に答える
1

提案

DELETE FROM x WHERE ROWID IN
(WITH y AS (SELECT xCOL, MIN(ROWID) FROM x GROUP BY xCOL HAVING COUNT(xCOL) > 1)
SELCT a.ROWID FROM x, y WHERE x.XCOL=y.XCOL and x.ROWIDy.ROWID)
于 2012-05-10T15:38:21.487 に答える
0

これで試してみてください。

DELETE FROM firsttable WHERE unique_ID NOT IN 
(SELECT MAX(unique_ID) FROM firsttable GROUP BY FID)

編集: 1つの説明:

SELECT MAX(unique_ID) FROM firsttable GROUP BY FID;

この sql ステートメントは、各重複行グループから最大の unique_ID 行をそれぞれ選択します。また、delete ステートメントは、これらの最大の unique_ID 行を保持し、各重複グループの他の行を削​​除します。

于 2012-05-10T19:14:29.210 に答える
0

これを試すことができます。

delete from tablename a
where a.logid, a.pointid, a.routeid) in (select logid, pointid, routeid from tablename 
group by logid, pointid, routeid having count(*) > 1)
and rowid not in (select min(rowid) from tablename
group by logid, pointid, routeid having count(*) > 1)
于 2017-11-21T07:21:00.613 に答える