【Access2003】任意の変数(id)の重複を除外したいのですが、


http://q.hatena.ne.jp/1180581937

で重複がわかった"id"にフラグ(例:テーブルの変数名"flg"に1をたてる)をたてた後、重複除外したいと思います。

重複除外の際、id以外の変数での優先順位はありませんので、それをふまえてどうすればよいか教えてください。
(Accessはかなり初心者です)

回答の条件
  • 1人2回まで
  • 登録:2007/05/31 16:05:17
  • 終了:2007/06/04 15:46:42

回答(3件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012007/05/31 16:25:52

ポイント27pt

『flgフィールドが1であれば削除』ということであれば単純に削除クエリ

DELETE FROM テーブル名 WHERE flg = 1;

で削除してしまえば良いかと思いますが、

そうではなくて、

フラグを立てる所から始めたいという事であれば『何を基準にして残すべき1レコードを指し示すのか』が問題となります。

例えば

no  id  data  date
 1  a   aaa   2007/5/1
 2  b   bbb   2007/5/1
 3  a   ccc   2007/5/2

という元データがあったと仮定してnoの若い方を優先にして重複を消すとすれば

no  id  data  date
 1  a   aaa   2007/5/1
 2  b   bbb   2007/5/1

が求める答えとなりますし日付優先であれば

no  id  data  date
 2  b   bbb   2007/5/1
 3  a   ccc   2007/5/2

が求める答えとなります。

といったように求める答えが異なるという事は

『求めるための式(この場合はSQL文)も異なってきます』ので、

質問の際には「元のデータ」と「求めるデータ」を明確に相手に伝えておかないと回答は違った方向に進んでしまうかもしれません。

まずはサンプルを用意してみてください。

id:u-chan

ありがとうございます。

ご指摘の点は理解しています。

(普段は、どの変数のどういう値を優先するか...ということばかりやっていますので)

質問文でも記載したとおり、今回わたしが必要な作業は「単純な重複の削除」になりますので、その部分は無視して結構です。ただし、ご記載のように削除キー(no/date)がないと、作業が返って面倒になるのでしたら、後の"no"を活かした後、"flg"に1を立てることを想定いただければと思います、よろしくお願いします。

2007/05/31 16:48:16
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012007/05/31 17:29:37

ポイント27pt

(1)idが同じであればレコードの内容もまったく同じという条件であれば

SELECT DISTINCT *
FROM テーブル名;

というクエリの結果を用いればよろしいでしょう。

(2)レコードの内容は異なるかもしれないけれど、

それらの内容を無視して、idが同じならば、その中のどれでも良いから1件だけを残したいのであれば

SELECT id,FIRST(フィールド名),FIRST(フィールド名),FIRST(フィールド名)
FROM テーブル名
GROUP BY id

というクエリの結果を用いればよろしいでしょう。

とりあえず基本として上記2点をあげましたが、これらはほんの一例に過ぎず

先に回答しましたように「元のデータ」と「求めるデータ」によって調整は多々必要になりますことは再度申し上げておきます。

さらに、noやdateといったような基準が無いということはSQLが各レコードを処理する際に

「残すべきレコードなのかどうかを判断させる材料が無い」という事ですから

データベース設計の際にはユニークキーというものを考慮なされることを強くお勧めします。

(今回の場合であればオートナンバー型のフィールドを追加しておいて

「一番新しく登録されたレコードを残すようにする」とったような対処が今後のためにはよろしいかと思います)

id:freemann No.3

freemann回答回数302ベストアンサー獲得回数462007/05/31 17:36:34

ポイント26pt

以下のようなSQL文でフラグを立ててそのあと、そのflgの値で削除してすればよろしいかと。削除のSQL文はkn1967さんのを使えばよろしいかと。

---------------------------------------------------

UPDATE テーブル名 SET flg = 1

WHERE フィールド名1 IN (SELECT フィールド名1 FROM テーブル名 GROUP BY フィールド名1 HAVING count(*) > 1);

id:u-chan

皆様、どうもありがとうございました。

2007/06/04 15:46:19
  • id:rikuzai
    id_list内にある重複idを削除したいというのがゴールでしょうか。
    その場合、他にフィールドがないのであれば、
    id_listテーブルをコピーして構造だけを複製貼り付けし、
    idフィールドにキーを設定してから、
    元のid_listのデータを複製テーブルに追加すれば、
    重複分はエラーになって追加されないので、idフィールドがユニークなテーブルになります。

    複数フィールドがある場合で、同一idの他フィールド内容は同じであればテーブル全体をグループ化したものを再テーブル化すれば良いだけです。

    複数フィールドがある場合で、道一idの他フィールド内容に差がある場合は、
    重複フラグを立てた後「どのレコードを採用するか」という条件付けが必要になるので、今の前提だけでは処理ができないということになります。
  • id:rikuzai
    >その部分は無視して結構です。
    その部分を無視して、前回のような重複クエリでつけられたフラグを元に削除を行うと、
    例えばid:5が2カウントあってid:5にフラグをつけたら、
    id:5のデータは二件とも削除されてしまいます。
    つまりこのフラグのつけかたでは、「どれを残すか」が決められないということです。
    重複したコードはテーブルから全削除していいのなら、
    kn1967さんの
    DELETE FROM テーブル名 WHERE flg = 1;
    で解決します。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません