重複を除去するSQL単一のテーブル/マルチテーブルのクエリ

重複を除去するSQL単一のテーブル/マルチテーブルのクエリ

シングルテーブルの異なります

マルチテーブル群によって、

そして制限によって順番によってグループの前に置かれなければならない、またはエラーになります

************************************************** **********************************

図1に示すように、冗長なルックアップテーブルの重複レコード、重複レコードを決定するために、単一のフィールド(peopleid)に基づいています

人から選択*
peopleIdでは(カウント(peopleId)を有するpeopleIdによって人々のグループからpeopleIdを選択> 1)

図2に示すように、テーブルが削除され、冗長重複レコード、重複レコードは、ROWIDのみ最小の記録を残し、(peopleidが)に応じて決定される単一のフィールドである
人々から削除
でpeopleidは(COUNT(peopleid)>を備えたpeopleidからの人々によるグループpeopleidを選択します。1 )
とNot ROWID(SELECT分(ROWID)グループでCOUNT(peopleid)>をHAVING peopleidからの人々による。1)

3、余分なルックアップテーブルが繰り返し記録されている(複数のフィールド)
SELECT *履歴書Aから
(a.peopleId、a.seq)で(*)>(履歴書、配列からpeopleidにより、HAVING COUNTをSEQグループをpeopleidを選択します。1)

図4に示すように、テーブルは、行IDのみ最小の記録を残し、冗長重複(複数のフィールド)、削除された
履歴書Aから削除
(HAVING略歴、SEQからpeopleidによって、SEQグループpeopleidを選択中(a.peopleId、a.seq)をCOUNT(*)>。1)
peopleidグループ、SEQ HAVING COUNT(*)>によると、履歴書からROWIDない(SELECT分(ROWID)インチ1)


図5は、繰り返し、余分な(複数のフィールド)を記録したルックアップテーブルは、ROWID最小記録が含まれていない
履歴書AからSELECT *
(HAVING履歴書、SEQからpeopleidにより、SEQグループをpeopleidを選択して(a.peopleId、a.seq) COUNT(*)>。1)
peopleidグループ、SEQ HAVING COUNT(*)>によると、履歴書からROWIDない(SELECT分(ROWID)インチ1)

(B)
例えば
そこフィールド「名前」は、表Aであり、
そして異なるレコード間の「名前」の値は、同じであってもよい
今「名前」値、テーブル内のレコードのうち、必要ですエントリを複製し、
選択名、COUNT(*)を有するカウントグループ別名から(*)> 1。

チェックも大きい場合は、同じ性別は次のとおりです。
名前グループAから選択することで、名前、性別、COUNT(*)を、セックスCOUNT(*)>を持つ1。

(iii)の
方法A

ID整数@、@max整数を宣言

cur_rowsメインフィールドを有する数でテーブル群から選択主要フィールド、COUNT(*)のローカルカーソル宣言(*)> 1

オープンcur_rows

最大@、@のIDにcur_rowsをフェッチ

@@ FETCH_STATUS = 0ながら、

ベギン

@max = @max -1を選択

設定行数@max

フィールド= @idメインテーブルから削除

最大@ @のIDにcur_rows、フェッチ
の端を

近くcur_rows

設定行数0

方法二

「重複」とは、一つは、他のフィールドは繰り返さないかもしれないが第二は、そのような名前のフィールドの繰り返しのように重複したレコードのキー・フィールドの一部であり、すべてのフィールドが重複レコードであることを、完全に重複したレコードである、二つの意味で重複するレコードを持っています繰り返すか、無視することができます。

1は、最初の繰り返しのため、比較的容易に使用して、解決するために

tableNameのとは別の*を選択

結果セットは、重複レコードなく得ることができます。

テーブルは、重複レコード(1予約重複)を除去する必要がある場合、以下の方法によって除去することができます

tableNameのから#Tmpに*明確な選択

表tableNameをドロップ

#TmpからtableNameのに選択*
テーブル#Tmpをドロップ

繰り返しの悪い生成されたテーブルの設計は、列を解決することができるユニークなインデックスを増やすことであるため、これが発生します。

図2に示すように、典型的には次のように繰り返し記録動作において最初のレコードを保持するために必要なそのようなオーバーラップの問題

名前の二つのフィールドを取得するために、重複するフィールドがあると仮定し、住所、結果のユニークなセットが必要です

選択アイデンティティ(int型、1,1)AUTOIDとして、* #TmpにtableNameのから

名前、AUTOIDによって#Tmp群から選択分(AUTOID)#TMP2にAUTOIDとして

AUTOIDでは、(#1 TMP2からAUTOIDを選択)#Tmpから選択*

、最後の選択名を取得し、結果セットを繰り返さないアドレス(このコラムselect句に記述することができAUTOIDフィールドよりは、実際の書き込みを省略しています)

(D)
問い合わせ反復

ID(中にはテーブル名からIDを選択するテーブル名から選択*

IDによるグループ

カウントを有する(ID)> 1

3、余分なルックアップテーブルが繰り返し記録されている(複数のフィールド)
SELECT *履歴書Aから
(a.peopleId、a.seq)で(*)>(履歴書、配列からpeopleidにより、HAVING COUNTをSEQグループをpeopleidを選択します。1)

実行するには、(a.peopleId、a.seq)は、そのようなパスが発行された書き込みの問題を引き起こします!

おすすめ

転載: www.cnblogs.com/hyhy904/p/10987448.html