- 締切済み
アクセスで重複データの抽出について
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- tsubuyuki
- ベストアンサー率45% (699/1545)
すいません、拙いモノで申し訳ありませんが 私も参加させてくださいませ。 テーブル名「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)
- 30246kiku
- ベストアンサー率73% (370/504)
#4です > hatana さんのは・・・ hatena さん、大変失礼いたしました。
- 30246kiku
- ベストアンサー率73% (370/504)
おはようございます #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; 以上 報告でした
- hatena1989
- ベストアンサー率87% (378/433)
フィールド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)
テーブル名を「★★」 フィールド名を「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 のレコードがあったとしても、これは表示されません。 (重複していないので) ※ 処理性能はわかりません
- hatena1989
- ベストアンサー率87% (378/433)
このテーブルを元にクエリを作成して、集計クエリにして、下記のように設定します。 フィールド フィールド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;