- ベストアンサー
配列の重複削除について
- 複数の配列の重複を削除する方法について相談があります。特定のフィールドがすべて同じ値の場合、その配列を削除したいです。クエリで対応できるかアドバイスをいただきたいです。
- たくさんのデータが含まれる複数の配列から、特定のフィールドの値がすべて同じ場合、その配列を削除する方法を教えてください。
- 複数の配列に重複するデータがある場合、特定のフィールドが11個以上同じ値である場合に、その配列を削除する方法を教えてください。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
>すべて11個以上同じデータの場合、すべて削除したい という質問だったのでテーブルを削除クエリで処理するものと思っていましたが、私の勘違いですかね。 補足で、 >すべてのフィールドを表示できないのでしょうか? とあるので、ひょっとしたら選択クエリで質問の内容を 表示したいということですか。 いずれにしても、 選択クエリの場合は、 SELECT * FROM 生11件以上検証 WHERE フィールド7 & フィールド9 In (SELECT フィールド7 & フィールド9 as 仮フィールド FROM 生11件以上検証 GROUP BY フィールド7, フィールド9 HAVING COUNT(フィールド7 & フィールド9) <10); 削除クエリの場合は、 DELETE * FROM 生11件以上検証 WHERE フィールド7 & フィールド9 In (SELECT フィールド7 & フィールド9 AS 仮フィールド FROM 生11件以上検証 GROUP BY フィールド7, フィールド9 HAVING COUNT(フィールド7 & フィールド9) >10); としてみてください。 一応確認のために、削除クエリと選択クエリでは不等号の向きは 逆になっています。数値は適当にしています。
その他の回答 (7)
- piroin654
- ベストアンサー率75% (692/917)
>実際はフィールド7とフィールド9の10件以上のデータが >あった場合135フィールドのなかで >フィールド7とフィールド9の同じデータがあった場合 >その他の全フィールド136を抽出したかったのです。 つまり、回答したSQL文ではほかにフィールドがあった場合は 回答したSQL文では対応できないのでは、と思われているかの ような感じですが、私の解釈に間違いはないでしょうか。 もしそうならば比較するのはフィールド7とフィールド9だけで 他にフィールドがいくつあっても回答したSQL文で出来ます。 ためしに、質問のサンプルに適当な名前のフィールドを2、3追加 して適当にデータを埋めてクエリを実行してみてください。
補足
ご連絡ありがとうございます。 想定していた内容として データ全部の細かい仕様をご提示してしまうと ご提案していただく方が混乱してしまうと思い サンプルをご提示して 本来でしたら、抽出条件、もしくはSQLビューから 実行し、あとの足りないフィールドは テーブル名.*として追加する予定でしたが ご提示いただいたSQLをそのまま実行すると SQL文ではなく フィールド テーブル 並び替え などがある欄に 表示のチェックマークは表示されなくなりまして・・・ 最後の質問ですが SQLビューに100個以上のフィールドを追加するのは大変なのですが SQLからテーブル名.*にしてすべてのフィールドを 表示できないのでしょうか?
- piroin654
- ベストアンサー率75% (692/917)
何となくですが、補足のエラーがなぜ起こるのか わかったような・・・ >ご提示頂いたを外したものを抽出条件に張り付けたのですが同じエラー項目が表示されます。 の中で、 >ご提示頂いたを外したものを抽出条件に張り付けた この部分が間違いのもとで、 なぜ抽出条件に貼り付けたのかわかりませんが、 私が回答したSQL文をクエリの抽出条件に 貼り付けるのではなく、新規のクエリをデザインビューで 表示し、そのクエリをSQLビューにし、そのまま 貼り付け、保存してください。その保存したクエリを 実行してみてください。
補足
ご連絡ありがとうございます。 もしかして、そのままSQLを張り付けると、 対象のフィールドしか抽出できないSQLでしたか。 こちらはサンプルでご提示させていただいたのは フィールド7とフィールド9のみのマッチングですが 実際はフィールド7とフィールド9の10件以上のデータが あった場合135フィールドのなかで フィールド7とフィールド9の同じデータがあった場合 その他の全フィールド136を抽出したかったのです。 細かい説明をしなくてすいません。
- piroin654
- ベストアンサー率75% (692/917)
もう一つテーブル名が・・・ DELETE [フィールド7], [フィールド9], [フィールド7] & [フィールド9] AS 仮フィールド FROM 生11件以上検証 WHERE フィールド7 & フィールド9 In (select フィールド7 & フィールド9 from 生11件以上検証 GROUP BY フィールド7, フィールド9 HAVING COUNT(フィールド7 & フィールド9) >10); 何度もすみません。なにせ久しぶりの投稿でテンパっています。 最初にすべてのフィールド名やテーブル名の[]をはずした状態で 実行してみてください。こちらではとくに問題なく削除できるのですが。
補足
ご連絡ありがとうございます。 ご提示頂いたを外したものを抽出条件に張り付けたのですが同じエラー項目が表示されます。 ちなみにクエリの表示の抽出条件に []を外したものを 下記をそのまま張り付けているのですが スペースとかおかしい場所があるのでしょうか。 また抽出条件の張り付ける際の設定を 見直す必要があるのでしょうか。 DELETE フィールド7, フィールド9, フィールド7 & フィールド9 AS 仮フィールド FROM 生11件以上検証 WHERE フィールド7 & フィールド9 In (select フィールド7 & フィールド9 from 生11件以上検証 GROUP BY フィールド7, フィールド9 HAVING COUNT(フィールド7 & フィールド9) >10);
- piroin654
- ベストアンサー率75% (692/917)
すみません。フィールド名の変更が抜けているところが ありました。 DELETE [フィールド7], [フィールド9], [フィールド7] & [フィールド9] AS 仮フィールド FROM Tdata100 WHERE フィールド7 & フィールド9 In (select フィールド7 & フィールド9 from Tdata100 GROUP BY フィールド7, フィールド9 HAVING COUNT(フィールド7 & フィールド9) >10); です。途中のf2のところがそのままでした。 No3でもかきましたが、フィールド名やテーブル名を []で囲む必要はありません。Accessが「理解不能です」 といってきたらフィールド名あたりから一つずつ[]で 囲って確認しながら次のフィールド名を[]で囲って みてください。場合によりAccessが自動的に[]で 囲む場合もあります。テーブル名は普通は[]で囲みません。 (たぶん・・・そういうことに遭遇したことがないので)
- piroin654
- ベストアンサー率75% (692/917)
テーブル名やフィールド名を[]で囲む必要はないのですが、 あえてならば、補足のフィールド名などを使用して、 DELETE [フィールド7], [フィールド9], [フィールド7] & [フィールド9] AS 仮フィールド FROM 生11件以上検証 WHERE フィールド7 & フィールド9 In (select f2 & フィールド9 from 生11件以上検証 GROUP BY フィールド7, フィールド9 HAVING COUNT(フィールド7 & フィールド9) >10); にしてみてください。 それと、11個以上というならば補足の <11 という 書き方は不等号の向きが反対です。これでは10個以下の ものはすべて削除対象になります。 11個を含めるならば >10 あるいは >=11 です。
- piroin654
- ベストアンサー率75% (692/917)
no1です。11個以上というのは11個を含むのか含まないのか わからないので適当に11としていますが、そちらで条件に 合わせて変更してくさい。
- piroin654
- ベストアンサー率75% (692/917)
f1とf2はフィールド名とします。フィールド名やテーブル名は実際に合わせてください。 サブクエリでは返す結果は一つなので、二つのフィールドを結合して一つのフィールドにしました。仮フィールドというのは結合したフィールドの仮置き場みたいなもので名称はそのままでいいです。 DELETE f1, f2, f1 & f2 AS 仮フィールド FROM テーブル名 WHERE f1 & f2 In (SELECT f1 & f2 FROM テーブル名 GROUP BY f1, f2 HAVING COUNT(f1 & f2) >11);
補足
ご提示ありがとうございます。 ご提示いただいた条件を 抽出条件に張り付けたのですが 指定した式の構文が正しくありません。または テキストデータを引用符で囲む必要があります。 下記の点で 引用符等 なにかおかしな点はございますでしょうか。 1テーブル名 →生11件以上検証 2フィールドの名→フィールド7 フィールド9 3仮フィールドはそのまま DELETE [フィールド7], [フィールド9], [フィールド7] & [フィールド9] AS [仮フィールド] FROM [生11件以上検証] WHERE [フィールド7] & [フィールド9] In (SELECT [フィールド7] & [フィールド9] FROM [生11件以上検証] GROUP BY [フィールド7], [フィールド9] HAVING COUNT([フィールド7] & [フィールド9]) <11);
お礼
ご連絡ありがとうございます。 選択クエリのSQLで対応で来ました。 こちらですと、仕様が変更になったとき、どのキーでソートするとか、フィールドを選択したり扱いやすいです。 説明やサンプルがシンプルすぎて、大変失礼しました。 ありがとうございました。