• 締切済み

アクセスで重複データの抽出について

アクセスで添付画像のようなテーブルがあり、重複データの抽出を行いたいです。 抽出結果は 120 0 となるようにしたいです。 つまり、 ・フィールド1を基準に、フィールド2が全て0だった場合のみ抽出する という条件です。 どのように行えばよいか、お分かりの方お教え下さい。 よろしくお願いいたします。

みんなの回答

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.7

すいません、拙いモノで申し訳ありませんが 私も参加させてくださいませ。 テーブル名「Table1」、フィールド名をそれぞれ「F1・F2」として SQL文だと以下の感じ。デザインビューは添付図でご確認ください。 SELECT Table1.F1, Table1.F2 FROM Table1 WHERE (((Table1.F2)=0) AND ((DCount("[F1]","Table1","[F1]=" & [F1] & " And [F2]=" & 0))>1)); 要するに、 DCount関数で「[F1]フィールドが同じで[F2]が“0”のレコード数」を数え、 それが「1件を超える(=2以上=重複あり)」のレコードのうち、 「[F2]が“0”」のレコードだけを表示してやってます。 元データ1000件で完全に表示されるまで1秒ちょっとかかってしまうのが難点です。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.6

自信ありませんが,自分も参加させていただきます。 フォームのレコードソースをクエリーで、いじってみました 結果次のようなSQL文が生成されました。 SELECT[フィールド1], Sum(Abs([フィールド2])) AS 絶対値 FROM テーブル1 GROUP BY [フィールド1] HAVING (((Sum(Abs([フィールド2])))=0));

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.5

#4です > hatana さんのは・・・ hatena さん、大変失礼いたしました。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

おはようございます #2です 想定データ量がわからないので、提示の範囲で動くか・・・をメインで考えてました。 NOT EXISTS での方法は、データ量が多くなればドンドン遅くなると思われます。 以下の10レコードを順にコピーし、100、1000、5000 レコードのテーブルを作成し 表示されるまでを(雰囲気)時計で ( an はオートナンバ) an  F1  F2 1  120  0 2  120  0 3  120  0 4  133  -50 5  133  50 6  133  0 7  115  100 8  115  -25 9  115  60 10  135  0 上記内容のテーブルを、「T19_100」「T19_1000」「T19_5000」名でコピーし、 以下を実行すると内容が出来上がります。 (このデータで想定した事になるのかは?です) Public Sub test1()   Dim rs As New ADODB.Recordset   Dim rsC As ADODB.Recordset   Dim v As Variant   Dim i As Long, iCnt As Long   For Each v In Array(100, 1000, 5000)     rs.Open "T19_" & v, CurrentProject.Connection, adOpenStatic, adLockOptimistic     If (Not rs.EOF) Then       Set rsC = rs.Clone       iCnt = rs.RecordCount       While (iCnt < v)         rsC.AddNew         For i = 0 To rs.Fields.Count - 1           Select Case rs(i).Name             Case "an"             Case Else               rsC(i) = rs(i)           End Select         Next         rsC.Update         rs.MoveNext         iCnt = iCnt + 1       Wend       rsC.Close       Set rsC = Nothing     End If     rs.Close   Next End Sub クエリの内容は以下の様な感じ SELECT Q1.F1, 0 AS F2 FROM T19_5000 AS Q1 WHERE NOT EXISTS (SELECT 1 FROM T19_5000 WHERE F1=Q1.F1 AND F2 <> 0) GROUP BY Q1.F1 HAVING Count(*)>1; クエリのダブルクリックから表示されるまで 100 レコードは、1 秒未満 1000 レコードは、1.5 秒くらい 5000 レコードは、24 秒くらい 5000 レコードの F1、F2 にインデックス重複ありを設定すると 5 秒くらい hatana さんのは全て 1 秒未満でした SELECT F1, 0 AS F2 FROM T19_5000 GROUP BY F1 HAVING Min(F2)=0 AND Max(F2)=0 AND Count(*)>1; 以上 報告でした

回答No.3

フィールド2が0でも1件だけのレコードは抽出しない場合は、 No.1 のクエリにさらに下記のフィールドを追加してください。 フィールド フィールド1 集計    カウント 表示    □ 抽出条件 >1 SQLでは、 SELECT [テーブル1].[フィールド1], Min([テーブル1].[フィールド2]) AS フィールド2の最小 FROM テーブル1 GROUP BY [テーブル1].[フィールド1] HAVING Min([テーブル1].[フィールド2])=0 AND Max([テーブル1].[フィールド2])=0 AND Count([テーブル1].[フィールド1])>1; 30246kikuさん、こんばんは。 NOT EXISTS の方法と比べて速度的にはどうなんでしょうかね。 ちょっと興味がありますね。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

テーブル名を「★★」 フィールド名を「F1」「F2」と仮定します。 クエリの SQLビューに以下を記述してみます。 SELECT Q1.F1, 0 AS F2 FROM ★★ AS Q1 WHERE NOT EXISTS (SELECT 1 FROM ★★ WHERE F1=Q1.F1 AND F2 <> 0) GROUP BY Q1.F1 HAVING Count(*) > 1; ※ 上記では F2=0 のレコードで、F1 が重複していなければ抽出されません 提示画像内に、135 0 のレコードがあったとしても、これは表示されません。 (重複していないので) ※ 処理性能はわかりません

回答No.1

このテーブルを元にクエリを作成して、集計クエリにして、下記のように設定します。 フィールド フィールド1 フィールド2 フィールド3 集計    グループ化 最大    最小 表示      レ      レ     □ 抽出条件          0      0 SQLビューでは下記のようになります。 SELECT [テーブル1].[フィールド1], Min([テーブル1].[フィールド2]) AS フィールド2の最小 FROM テーブル1 GROUP BY [テーブル1].[フィールド1] HAVING Min([テーブル1].[フィールド2])=0 AND Max([テーブル1].[フィールド2])=0;

関連するQ&A