ホームページ > php教程 > PHP开发 > SQL はテーブル内のすべての重複レコード データを検索します

SQL はテーブル内のすべての重複レコード データを検索します

高洛峰
リリース: 2016-11-16 11:00:54
オリジナル
1506 人が閲覧しました

1. インタビュー中に問題が発生しました。それは、id と name の 2 つのフィールドを含むテーブルを作成し、繰り返しの名前を持つすべてのデータをクエリすることです。

SELECT * from xi a where (a.username) in  (SELECT username from xi group by username  having count(*) > 1)
ログイン後にコピー

2. すべてをクエリしてグループ化した後。まず、データ、クエリ データと重複データの繰り返し数を以下に示します。

SELECT count(username) as '重复次数',username from xi group by username  having count(*)>1 order by username desc
ログイン後にコピー

3. 他の人の結果を表示するには、次の手順を実行します。 重複レコードをクエリして削除する完全な方法

1.テーブル内の重複レコードは単一フィールド (peopleId) に基づいて判断されます

SELECT * from people
where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)
ログイン後にコピー

2. テーブル内の重複レコードは単一フィールド (peopleId) に基づいて判断され、レコードのみが残ります。最小の rowid

DELETE from people 
where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1)
and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)
ログイン後にコピー

さらに、MySQL で上記の SQL を使用すると、次のエラーが報告されます。 FROM 句で更新対象のテーブル 'XXX' を指定することはできません。 したがって、テーブルの変更中に同じテーブルをクエリすることはできません。上記のエラーを回避するために、テーブル データを変更するための条件として一時テーブルが使用されます。

DELETE from user where user_id in(
    (SELECT user_id from 
        (SELECT c.* from cab_user c where c.extra_id in 
            (SELECT  a.extra_id  from user a group  by  a.extra_id having  count(a.extra_id) > 1) and c.user_id not in 
            (SELECT min(b.user_id) from  user b group by b.extra_id having count(b.extra_id )>1)
        ) d
    )
)
ログイン後にコピー

3. テーブル内の重複する重複レコード (複数のフィールド) を検索します

SELECT * from vitae a
where (a.peopleId,a.seq) in  (SELECT peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)
ログイン後にコピー

4. テーブル内の重複する重複レコード (複数のフィールド) を削除し、最小の ROWID を持つレコードのみを残します

delete from vitae a
where (a.peopleId,a.seq) in  (SELECT peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
ログイン後にコピー

5. table 最も小さい rowid を持つレコードを除く、冗長な重複レコード (複数のフィールド)

次に、テーブル内のレコード間で「name」値の重複する項目をチェックする必要があります。

SELECT * from vitae a
where (a.peopleId,a.seq) in  (SELECT peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
ログイン後にコピー

性別も同じであることもチェックすると、結果は次のようになります:
SELECT Name,Count(*) From A Group By Name Having Count(*) > 1
ログイン後にコピー

(3)
方法 1 宣言 @max integer,@id integerdeclare cur_rows カーソルローカルを選択メインフィールド、count(*) を持つメインフィールドごとにグループ化 > 1open cur_rowsfetch cur_rows into @id,@maxwhile; @@fetch_status=0beginselect @ max = @max -1set rowcount @maxdelete from table name where main field = @idfetch cur_rows into @id,@maxendclose cur_rowsset rowcount 0

方法 2 「レコードの重複」には重複レコードの 2 つの意味があります。完全に重複したレコード、つまりすべてのフィールドが繰り返されるレコード、次に、名前フィールドなどの一部のキー フィールドが繰り返され、他のフィールドは繰り返されないか無視できるレコードです。

1. 最初のタイプの重複の場合は、select unique * from tableName を使用して、重複レコードのない結果セットを取得する方が簡単です。テーブルで重複レコードを削除する必要がある場合 (1 つの重複レコードを保持)、次のように削除できます。 select unique * into #Tmp from tableNamedrop table tableNameselect * into tableName from #Tmpdrop table #Tmp この重複の理由は、テーブルが設計が正しくありません。これは数週間で発生しますが、一意のインデックス列を追加することで解決できます。

2. この種の重複問題では、通常、重複レコードのうち最初のレコードを保持する必要があり、その操作方法は次のとおりであり、これら 2 つの一意の結果セットを取得する必要があるとします。フィールド selectidentity(int,1,1) as autoID, * into #Tmp from tableNameselect min(autoID) as autoID into #Tmp group by Name,autoIDselect * from #Tmp where autoID in(select autoID from #tmp2)最後の選択は Name、Address は重複しない結果セットです (ただし、追加の autoID フィールドがあります。この列は実際に記述するときに select 句で省略できます)

(4) 反復クエリ

SELECT Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1
ログイン後にコピー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート