2

おそらく、これに役立つ SQL ステートメントはないので、これを実際に何と呼ぶべきかわかりません。

私が取り組んでいるAccess 2013データベースでは:

すべてのテーブルには、name address phone city state zip

として使用されprimary key is the phone numberますが、Access の主キーとして設定されていません。

このデータベースから重複レコードを削除したいと考えています。

ここでは電話番号が一意の識別子であることは明らかですが、すべてのデータを取得し、電話番号で並べ替え、電話番号を含むレコードを削除してそのうちの 1 つを保持するにはどうすればよいでしょうか?

ほとんどの場合、住所、名前、およびその他すべてのフィールドが一致することはほぼ確実です。テーブルをクリーンアップして、重複がないようにしたいだけです。

4

2 に答える 2

1

それphoneがあなたの疑似主キーだと思います。意味: クエリを使用して一意になる必要があります。

Postgres の場合、次のように動作します。

SELECT DISTINCT ON (phone)
  *
FROM your_table

電話番号ごとに任意の行を選択するため、電話番号が区別されます。

たぶんアクセスに相当するものがありDISTINCT ON (...)ますか?


テーブルにREAL UNIQUEid識別子がある場合、これは機能します。

SELECT *
FROM your_table
WHERE id IN (
  SELECT min(id)
  FROM your_table
  GROUP BY phone
)

完璧ではないかもしれませんが (最速のクエリ)、うまくいきました。

SELECT *
FROM (
  SELECT ROW_NUMBER() OVER () AS pseudoid, *
  FROM your_table
) x
JOIN (
  SELECT MIN(pseudoid) AS pseudoid
  FROM (
    SELECT ROW_NUMBER() OVER () AS pseudoid, phone
    FROM your_table
  ) z
  GROUP BY z.phone
) y
ON x.pseudoid = y.pseudoid

説明:

最初 (9 ~ 10 行目):

SELECT ROW_NUMBER() OVER () AS pseudoid, phone
FROM your_table

これにより、すべての行の pseudo_id (および電話番号) が得られます。したがって、重複するエントリがありますが、すべてのエントリには一意の疑似 ID があります。次に (7 行目から 12 行目):

SELECT MIN(pseudoid) AS pseudoid
FROM (
  SELECT ROW_NUMBER() OVER () AS pseudoid, phone
  FROM your_table
) z
GROUP BY z.phone

これにより、電話番号が一意になり、常に MIN (疑似) が選択されます。次に (3 ~ 4 行目):

SELECT ROW_NUMBER() OVER () AS pseudoid, *
FROM your_table

WHOLE テーブルの疑似 ID を作成します。

次に、これらのテーブルを結合します。これにより、電話番号ごとに、最小の疑似 ID を持つ完全な行 (+ 疑似 ID) が得られます。

少し小さい(そしておそらく速い):

WITH pseudo_id_table AS (SELECT ROW_NUMBER() OVER () AS pseudoid, * FROM your_table)
SELECT *
FROM pseudo_id_table x
JOIN (
  SELECT MIN(pseudoid) AS pseudoid
  FROM pseudo_id_table
  GROUP BY phone
) y
ON x.pseudoid = y.pseudoid
于 2013-02-28T23:17:39.833 に答える
0

より簡単なアプローチがあります:

  1. テーブルをコピーします(構造のみ)
  2. 電話を主キーにする
  3. 古いテーブルのデータを新しいテーブルに追加します。重複するレコードは、追加で拒否されます。
  4. 古いテーブルを削除します
  5. 新しいテーブルの名前を古いテーブル名に変更します

これは、どのレコードを保持するかが本当に重要でない場合にのみ機能します。

于 2013-03-01T12:02:18.820 に答える