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

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が見つからない時は、教えて!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:取...続きを読む

Q携帯電話のデータは削除しても復元可能?

パソコンなどで、ハードディスクの情報を削除しても実は削除できてなく、復元ソフトを使えばデータは元通りになると聞きました。
携帯電話でも同じように専用のソフトなどを使えば、消してしまったデータも復元することが可能なのでしょうか?

Aベストアンサー

度々失礼します。No.4です。

メールや着信・リダイヤルの履歴を復元する事は多分探し回っても難しいと思います。
それらはアドレス帳と違って随時上書かれるのが通常ですので…

かなり残念で悔しいと思いますが、恐らく携帯からは情報を復元する事は出来ないと思います。

ただ!!もしかすると、キャリアに通信記録が残っているかもしれません。半年も経っているので絶対とは言い切れませんが。
その情報を公開してもらうには、警察・裁判所の力が必要です(いくら本人と言っても通信履歴は公開してくれません)。

もし警察にまだ被害届けを出してない場合、犯人が見付かったら裁判になってもいいと言う事でしたら、
その旨を警察に話してキャリアの通信履歴を探ってもらうのも手でしょう。

通信履歴が分かると解約していても住所とか分かるハズですので、個人で探し回るより犯人が見付かる確立は高いと思います。

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削除したデータを復元させないようにするには

ノートPC(win98)を手放したいと思っているのですが
その際 個人情報やこれまでやり取りしたメールを削除したのですがこれを復元すしたり
再インストールしても過去のデータを復元できるソフトがあることを聞き ちょっと心配になってきました。
完全にデータを削除し、復元できないソフト というのはあるんでしょうか?教えてください、

Aベストアンサー

完全に削除する方法は無いようです。
例えば、ハードディスクのデータが全部0だけになったとしても、それぞれのビットの磁界の強さなどでデータを復元する特殊な機械があるそうです。
普通は、何度も上書きするという方法でほぼ完全に削除します。

taoのソフトは使ってみてとてもよかったです。
日立のサイトも書いておきます。

HDDデータ消去
http://www.hitachi.co.jp/New/cnews/2002/0124/

Qアクセス 正味の算出 フィールド1 オートID フィールド2 顧客No フィールド3 商品名 フィー

アクセス 正味の算出

フィールド1 オートID
フィールド2 顧客No
フィールド3 商品名
フィールド4 単価

このようなテーブル構成で、顧客Noでグループ化して、IDのカウントした結果が1、2となります。
その際、1の場合は1、2の場合は0.5と別フィールドに記載する方法を教えて下さい。

Aベストアンサー

>本当はIDのカウントが2以下なら1を3以上なら999(数値で0、1以外なら何でも良いです)

IIf([IDのカウントした結果のフィールド名]>=3,999,1)

Q一度削除したデータの復元に付いて

一度ごみ箱に移動して削除してしまったワードのデータを復元することは可能でしょうか?
うっかり必要なデータも削除してしまいました。
ごみ箱に移動→完全に削除以外の動作はしていません。
どうぞ宜しくお願いします。

Aベストアンサー

こんばんは。

フリーツールに“復元”という物があります。
以下に参考URLを添付しておきますので参考にしてみて下さい。
http://www.vector.co.jp/soft/win95/util/se410717.html

因みに、フリーツールなどが沢山乗っているVectorのHPで“復元”検索をしてみると
上記以外にもいくつか出てくる様なので、質問者さまの好みに合うものをインストールしてみるのもいいかもしれません。
うまく行く事を祈ってます。

参考URL:http://www.vector.co.jp/soft/win95/util/se410717.html

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)

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

Q3年前に削除したデータを復元したい。

3年前に不要と思って削除したexcelのCSVデータが、やはり必要になったので、復元したいと思っています。
復元について類似の質問はありますが、数年前に削除したケースは見つけられなかったので質問させていただきました。
市販のソフト、あるいは修理業者に依頼しても,復元は可能でしょうか?
WindowsXPのexcel2003を使っています。

Aベストアンサー

削除してからPCや削除したメディアなりを全く使っていなければ可能性はあるでしょうが、使っているならほぼ無理でしょう。

市販のソフトでも1週間前のデータ復元は以前した時は無理でしたが。数年前なので多少精度は上がってる可能性はありますが、さすがに3年前のデータの復元は難しいでしょう。

業者に依頼しても3年前のデータ復元は断られる可能性が大きいんじゃないでしょうか。

とりあえず駄目元で市販のソフトを試す程度でしょうね。

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 入れておきました。
...続きを読む


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

人気Q&Aランキング