ACCESSで、重複レコードを引っ張ってくるのは、重複クエリでやれましたが、逆に、重複レコード(1つのフィールド、或いは複数のフィールドに着目しての)の削除は、やれないのでしょうか?
イメージしているのは、エクセルのオートフィルタでの「重複データの削除」です。
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

方法を2つばかり示します:



A)選択クエリを使用する
「重複分のデータを表示させないだけ」(=削除はしない)場合は、そのテーブルをもとにしたクエリで、「固有の値」プロパティを「はい」に設定すればOKです。

但し、テーブルのデータが

  (ID,テキスト)=(1,aaa),(2,bbb),(3,bbb),(4,ccc)・・・

の場合、クエリに表示させるフィールドを「テキスト」のみにすれば、

  (テキスト)=(aaa),(bbb),(ccc)・・

となってくれますが、IDも含めてしまうと、重複分がそのまま表示されます(=テーブルのデータと変わらない)。


B)削除クエリで削除後に、追加クエリで再追加する
※こちらは、テーブルのデータを変更するやり方です※
1)重複クエリを、メニューの「クエリ(Q)」→「テーブル作成(K)」をクリックして、テーブル作成クエリにする
 (作成テーブル名を、仮に「重複分」とします)
2)テーブル作成クエリを実行して、「重複分」テーブルを作成
3)元のテーブルの重複データを全て削除
 (=No.1の方の回答で行ったこと)
4)「重複分」テーブルのレコードを、元のテーブルに追加する追加クエリを作成
5)追加クエリを実行

この操作を実行すると、元のテーブルのデータは下のように変わっていきます:

 (ID,テキスト)=(1,aaa),(2,bbb),(3,bbb),(4,ccc)
      ↓
 (ID,テキスト)=(1,aaa),(4,ccc)
      ↓
 (ID,テキスト)=(1,aaa),(4,ccc),(5,bbb)

なお、「ID」にオートナンバー型が設定されている場合を想定しています。
もし元のテーブルに「ID」がないなら、データの変遷は

 (テキスト)=(aaa),(bbb),(bbb),(ccc)
     ↓
 (テキスト)=(aaa),(ccc)
     ↓
 (テキスト)=(aaa),(bbb),(ccc)

となります。
    • good
    • 0
この回答へのお礼

大変遅くなりました。ありがとうございます。
理解できました。助かりました。

お礼日時:2005/10/05 08:55

私がやってました方法です。


(1)重複レコードが数件の場合は重複クエリの画面でレコードを選択し直接削除します。

(2)件数が多い時は、ホストからのデータ取り込み時など、頻繁に起きる時
コマンドボタンのプロシージャで処理します。
テーブルを読込み新しいテーブルを作成する。
削除するKeyが前のデータと同じなら書き込みしない。

参考までに、(2)は複雑です。 他に良い回答があるといいですね。
    • good
    • 1
この回答へのお礼

ありがとうございます。参考になりました。

お礼日時:2005/10/05 08:54

簡単にやるにはそのテーブルをテーブル構造のみコピーして新しいテーブル名を付け作ります。


そうすると空の新しいテーブルが出来ますので重複させたくないフィールドに主キーかインデックス(重複なし)を設定します。複数のフィールドの重複を除くにはその各フィールドにインデックス(重複なし)を設定すれば出来ます。
元のテーブルを再度コピーし貼り付けで既存のテーブルにデータを追加を選択しコピーすると重複レコードはエラーとなり重複レコードのみテーブルに追加されない状態でレコードを追加できます。
新しく作ったテーブルの名前を元のテーブルの名前に変更すれば終わりです。(元のテーブルは削除するか名前を変更するか新しいテーブルと置き換えるかですね)
    • good
    • 0
この回答へのお礼

ありがとうございました。ACCESSを活用する上で参考になりました。

お礼日時:2005/10/05 08:53

>重複レコードを引っ張ってくるのは、重複クエリでやれました・・・


重複クエリで引っ張れた結果が全て削除対称だとして、そのクエリのデザインビューでクエリのタイプを「削除」に変更し、実行すれば削除できます。

質問の内容に誤解があったらごめんなさい。

この回答への補足

問題があります。すべてデータがなくなってしまいました。

小生のやりたいこと。今テーブルに次のデータがあるとします。

data
aaaaa
aaaaa
aaaaa
bbbbb
bbbbb
bbbbb

これを、重複データを削除して、
data
aaaaa
bbbbb
だけとしたいのです。

エクセルのオートフィルタでは、1アクションでできます。それだけ、機能としては重要だと考えます。ACCESSで出来ないわけはないと思うのですが。
よろしくお願い致します。

補足日時:2005/09/14 10:19
    • good
    • 0
この回答へのお礼

大変遅くなりましたが、参考になりました。ありがとうございました。

お礼日時:2005/10/05 08:52

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccess 重複クエリにて、あるフィールドの値をキーに比較対象レコードを限定したい

いつもお世話になっております。よろしくお願い致します。

Access 2002 SP3。
重複クエリを使って、1つのテーブル内で、「重量」と「入庫日」が一致するレコードを抽出しています。

(重複クエリ実行結果サンプル)
ID    重量    入庫日    管理番号    取引先
M001   5140   2005/09/27   P5916000     M社
S018   5140   2005/09/27   P5916000PP    S社
M169   8100   2005/04/22   522A3014     M社
S6    9000   2005/04/22   522A3014GA    S社
S171   1050   2005/01/31   Z3988722     S社
S4    1050   2005/01/31   Z165785SP2    S社


「管理番号」の入力ミスや桁数違いを発見するために、「重量」と「入庫日」が同じものを抽出するのですが、
取引先が、M社 vs S社で比較したいのです。

重複クエリウィザードを用いて作成すると、S社 vs S社においても、「重量」「入庫日」が同じレコードを
表示してしまうので、それらは省きたいのです。
※上記サンプルでは、IDフィールドの値が「S141」と「S4」が該当。
(可能ならば、逆に、それらだけを表示するクエリも欲しい)


Accessには慣れておらず、またSQLもシスアド取得のために少ししたぐらいなもので・・・・。
どなたかお知恵をお貸しください。

情報が不足していれば、補足しますので、よろしくお願い致します。

いつもお世話になっております。よろしくお願い致します。

Access 2002 SP3。
重複クエリを使って、1つのテーブル内で、「重量」と「入庫日」が一致するレコードを抽出しています。

(重複クエリ実行結果サンプル)
ID    重量    入庫日    管理番号    取引先
M001   5140   2005/09/27   P5916000     M社
S018   5140   2005/09/27   P5916000PP    S社
M169   8100   2005/04/22   522A3014     M社
S6    9000   2005/04/22 ...続きを読む

Aベストアンサー

 以下を、クエリのSQLビューで貼り付けてください(「テーブル名」はお使いのテーブルの名称に変更してください)。「入庫日」のデータ型は「日付/時刻型」であることを前提としています。

SELECT テーブル名.ID, テーブル名.重量, テーブル名.入庫日, テーブル名.管理番号, テーブル名.取引先
FROM テーブル名
WHERE (((DCount("*","テーブル名","[重量] =" & [重量] & " AND [入庫日] = #" & [入庫日] & "# AND [取引先] " & IIf([1:取引先が相違、2:同一]=1,"<> '","= '") & [取引先] & "'"))>=[1:取引先が相違、2:同一]))
ORDER BY テーブル名.重量, テーブル名.入庫日, テーブル名.取引先;

 このクエリを開くと、「1:取引先が相違、2:同一」と表示され、入力待ちになりますので、取引先が異なるものを比較したい場合は数字の「1」、同じものを比較したい場合は数字の「2」を入力してください。
 これで水曜どうでしょう。

 以下を、クエリのSQLビューで貼り付けてください(「テーブル名」はお使いのテーブルの名称に変更してください)。「入庫日」のデータ型は「日付/時刻型」であることを前提としています。

SELECT テーブル名.ID, テーブル名.重量, テーブル名.入庫日, テーブル名.管理番号, テーブル名.取引先
FROM テーブル名
WHERE (((DCount("*","テーブル名","[重量] =" & [重量] & " AND [入庫日] = #" & [入庫日] & "# AND [取引先] " & IIf([1:取引先が相違、2:同一]=1,"<> '","= '") & [取引先] & "'"))>=[1:取...続きを読む

Qaccess前月差分クエリ書き換えたくない フィールド1 年月日 フィールド2 商品名 レコードは月

access前月差分クエリ書き換えたくない

フィールド1 年月日
フィールド2 商品名

レコードは月次で年度単位で持ち、毎月、先月分が今月に追加されます。

毎月、前月と前々月分の商品の個数の差を計算します。

フィールド1をformat関数で年月にし、グループ化したものを、201701-201612みたいにクエリを書いて
計算させています。

まずformatが良いのかmonthが良いかも分からないのですが、毎月の差分を取るクエリを書き換えたくなく、元テーブルから計算しやすいように加工するクエリをどう持てば良いか教えて下さい。

Aベストアンサー

以前回答させていただいた
https://oshiete.goo.ne.jp/qa/9605499.html

年月から1ヵ月の期間を求めるなら
DateSerial(Year([年月]),Month([年月]),1)
DateSerial(Year([年月]),Month([年月])+1,1)-1

上は年月の1日を求める
下は年月の翌月1日を出し、その前日(-1)を求めることで末日を求めている

先月を求めるなら
DateSerial(Year([年月]),Month([年月])-1,1)
yyyymmの形にするなら
Format(DateSerial(Year([年月]),Month([年月])-1,1),"yyyymm")

先々月を求めるなら
DateSerial(Year([年月]),Month([年月])-2,1)
yyyymmの形にするなら
Format(DateSerial(Year([年月]),Month([年月])-2,1),"yyyymm")

Qアクセス 重複の削除と残すパターン フィールド1 顧客ナンバー〔ユニーク) フィールド2 受付区分

アクセス 重複の削除と残すパターン

フィールド1 顧客ナンバー〔ユニーク)
フィールド2 受付区分
受付は0、キャンセルは1とレコードあり

顧客ナンバー、受付区分にてグループ化すると、

0パターン 受付
01パターン 受付とキャンセル
010パターン 受付とキャンセル、再び受付
0101パターン 受付とキャンセル、再び受付とキャンセル
この4パターンになり、行数は上から1、2、3、4行
となります。

ここから教えて下さい。
01パターンと0101パターンを無かった事にし0パターンと010パターンは1だけを残したいのですが、集計オプションを使い、条件をどのように書けばよろしいでしょうか?

受付区分にて合計を出したりカウントしたりしたのですが、うまくいきません。0を10、1を11や文字に置き換える事は出来ます。

Aベストアンサー

受付、キャンセルするたびにレコードを発生させていて、再受けを区別しなくていいなら、、、
受付を1、キャンセルを-1にして合計取ればいいんじゃね? まあ、今のままの値でも

-2*([受付区分]-0.5)

で、変換できるような気もするけど。

QAccess2003の更新クエリ、レコードの更新欄のフィールド名を自動的に入力するには?

AとBという2つのテーブルが、全く同じフィールドを30個持っています。
AとBでIDが同一のモノのみ、AにBのデータを丸々更新したいのですが
[B].[フィールド名1]というように、IDを除いた残り29個のレコードの更新の欄に
手入力する方法で現在行っています。

追加クエリなどだとフィールドが同じ場合は自動的にレコードの追加欄にフィールド名が現れるのですが
同様に更新クエリでもフィールド名を自動的に出す方法はありますか?
現在上記のような更新クエリを10件以上新規で作成しなければならないのですが
各件に29個も手入力で行うのが非常に面倒でなりません。
やはりSQL等で仕組んでいくようにするのでしょうか?

Aベストアンサー

作ったクエリの管理だけでも大変なものになりますね。
テーブルのフィールドが増減したら、また修正がたいへんですね。

参考までに(VBAでの処理になります:クエリは作りません)

使い方)
ボタンをクリックしたイベントなどで、以下を記述します。

  Call CopyFieldValue("A", "B", "ID")

テーブルAのフィールドを基準に、
テーブルAとテーブルBのIDが一致するものをテーブルAにコピーします。
(テーブルA/Bのフィールド名が同じだとして)

キーとなる部分に MsgBox 入れておきました。
UPDATE実行部分はコメントにしています。

ADO/ADOX での例です。
VBEのメニュー「ツール」->「参照設定」で、
 Microsoft ActiveX Data Objects 2.1 Library
 Microsoft ADO Ext. 2.8 for DDL and Security
が、参照可能となっていることを確認します。


---- 標準モジュールに以下を記述

Private Function FieldSet(TbTo As String, TbFrom As String, sFld As String) As String
  FieldSet = TbTo & "." & sFld & " = " & TbFrom & "." & sFld
End Function

Public Function CopyFieldValue(TbTo As String, TbFrom As String, TbKey As String)
  Dim catdb As New ADOX.Catalog
  Dim clm As Column
  Dim sSql As String
  Dim sTmp As String

  catdb.ActiveConnection = CurrentProject.Connection

  sTmp = ""
  For Each clm In catdb.Tables(TbTo).Columns
    If (clm.Name <> TbKey) Then
      sTmp = sTmp & ", " & FieldSet(TbTo, TbFrom, clm.Name)
    End If
  Next
  If (Len(sTmp) = 0) Then Exit Function
  sTmp = Mid(sTmp, 3)
  MsgBox "sTmp : " & sTmp

  sSql = "UPDATE " & TbTo & " INNER JOIN " & TbFrom & " ON " & _
        FieldSet(TbTo, TbFrom, TbKey) & " SET "
  sSql = sSql & sTmp & ";"
  MsgBox "sSql : " & sSql

'  CurrentProject.Connection.Execute sSql

End Function

---- ここまで

※ マクロから CopyFieldValue を呼び出したい(使いたい)場合には、
  マクロのアクション「プロシージャの実行」で指定します。

※ テーブル名/フィールド名を [ ] で囲みたい時には、
FieldSet = TbTo & "." & sFld & " = " & TbFrom & "." & sFld
 ↓
FieldSet = "[" & TbTo & "].[" & sFld & "] = [" & TbFrom & "].[" & sFld & "]"

※ テーブルBを基準とする時には、
For Each clm In catdb.Tables(TbTo).Columns
 ↓
For Each clm In catdb.Tables(TbFrom).Columns

テーブルAのフィールドを部分的に抜き出して作ったテーブルBの場合など
(テーブルBに無いテーブルAのフィールドは更新対象外に)


※ 関数名は適宜変更してください。

※ Function で作っていますが、戻り値は設定していません。

※ エラー処理は入れてません。


※※ UPDATE のSQL作成部分、以下でも動くようです。

  sSql = "UPDATE " & TbTo & " INNER JOIN " & TbFrom & " ON " & _
        FieldSet(TbTo, TbFrom, TbKey) & " SET "
  sSql = sSql & sTmp & ";"
 ↓
  sSql = "UPDATE " & TbTo & ", " & TbFrom & " SET "
  sSql = sSql & sTmp
  sSql = sSql & " WHERE (" & FieldSet(TbTo, TbFrom, TbKey) & ");"

作ったクエリの管理だけでも大変なものになりますね。
テーブルのフィールドが増減したら、また修正がたいへんですね。

参考までに(VBAでの処理になります:クエリは作りません)

使い方)
ボタンをクリックしたイベントなどで、以下を記述します。

  Call CopyFieldValue("A", "B", "ID")

テーブルAのフィールドを基準に、
テーブルAとテーブルBのIDが一致するものをテーブルAにコピーします。
(テーブルA/Bのフィールド名が同じだとして)

キーとなる部分に MsgBox 入れておきました。
...続きを読む

QAccess2003 削除クエリで式1フィールドがドンドン作成される

Access2003で削除クエリを作成しました。
抽出条件に「Aフォーム」内のトグルボタン「チーム1」(オプショングループ名=商品区分)をクリックした時に、[商品番号]が100より小さいものを、トグルボタン「チーム2」をクリックした時には、[商品番号]が100以上のものを抽出するよう入力しました。

【クエリデザインビューの状態↓】

フィールド  | [商品番号] | AA: [forms]![Aフォーム]![商品区分]
抽出条件 | < 100   | 1
または  | >= 100  | 2


一応上記で削除クエリは思うように実行できたのですが、このクエリを閉じてまた開くとフィールドAAと同じ内容で『式1:』フィールドが作成されてしまいます。また閉じて開くと、同じ内容で『式2:』が、次は『式3:』が…とドンドンと作成されてしまいます。
Access2003以外のAccessでは「式」フィールドは増えなかったです。

この『式~:』フィールドが勝手に作成されないようにするには、どうすればいいのでしょうか?もしくは、最初の削除クエリの作り方がおかしいのでしょうか?

教えて頂きたく、よろしくお願いします。

Access2003で削除クエリを作成しました。
抽出条件に「Aフォーム」内のトグルボタン「チーム1」(オプショングループ名=商品区分)をクリックした時に、[商品番号]が100より小さいものを、トグルボタン「チーム2」をクリックした時には、[商品番号]が100以上のものを抽出するよう入力しました。

【クエリデザインビューの状態↓】

フィールド  | [商品番号] | AA: [forms]![Aフォーム]![商品区分]
抽出条件 | < 100   | 1
または  | >= 100  | 2


一応上記で削除クエリは思うように実...続きを読む

Aベストアンサー

Accessは初心者に優しいデータベースというのが売りで
SQLを勉強しないでもクエリが作れるようになっています
そのためのGUIがクエリデザインビューです

Accessはあそこに入力された情報からSQLを作成しクエリとして保存します
次にクエリデザインビューを開いたときには
保存してあるSQLからデザインビューを再現します
そのとき抽出条件が複雑だなものだと元のものとは違った形に再現されてしまうことがあります

問題はこの後で違った形で再現したものを保存すると
また新しくその形からSQLを作成して保存します
そのときに最初の形とは違ったものになってしまうことがあるのです

これを防ぐ方法としては2回目以降保存しますかと聞いてきたときに
保存しないを選ぶことです

デザインビューをSQLビューにしてから保存しておくと
2回目にデザインビューで表示しようとしたときにもSQLビューになります


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報