• ベストアンサー

重複していないレコードの抽出方法について

下記のテーブルでフィールドAとBの関係で矛盾が生じているID 1と2を抜き出すSQLを必要としております。 AとBを合体させて判断しようと試みましたがダメでした。 ご存知の方ご教示いただけると大変助かります。 【テーブル】 ―――――――――― |ID| A |B| ―――――――――― |1 |AAA|B | |2 |AAA|C | |3 |BBB|D | |4 |BBB|D | |5 |CCC|E | |6 |DDD|F | ―――――――――― よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.5

A に対して 複数の B がある場合です。 同じ名前で 住所が異なる場合などを想定しています。 SELECT [テーブル名].* FROM テーブル名 INNER JOIN ( SELECT Q.A FROM (SELECT [テーブル名].A, [テーブル名].B FROM テーブル名 GROUP BY [テーブル名].A, [テーブル名].B ) AS Q GROUP BY Q.A HAVING Count(Q.A)>1 ) AS QQ ON [テーブル名].A = QQ.A;

ticktak
質問者

お礼

どうもありがとうございます。 自分のレベルでは理解するのが初めは難しいかと思いましたが、分解してみると納得いきました。 ありがとうございました。

その他の回答 (4)

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.4

Aを基準にBが矛盾している、Bを基準にAが矛盾している、と言う両方の状態を抽出したい場合は、以下の5つのクエリが必要です。 ---クエリ1--- SELECT A, Count(A) AS CA1 FROM テーブル1 GROUP BY A; ---クエリ2--- SELECT A, B, Count(A) AS CA2, Count(B) AS CB2 FROM テーブル1 GROUP BY A, B; ---クエリ3--- SELECT B, Count(B) AS CB1 FROM テーブル1 GROUP BY B; ---クエリ4--- SELECT クエリ2.A, クエリ2.B FROM (クエリ2 LEFT JOIN クエリ1 ON クエリ2.A = クエリ1.A) LEFT JOIN クエリ3 ON クエリ2.B = クエリ3.B WHERE (((クエリ2.CA2)<>[クエリ1].[CA1])) OR (((クエリ2.CB2)<>[クエリ3].[CB1])); ---結果クエリ--- SELECT テーブル1.ID, テーブル1.A, テーブル1.B FROM テーブル1 INNER JOIN クエリ4 ON (テーブル1.A=クエリ4.A) AND (テーブル1.B=クエリ4.B) ORDER BY ID; ANo.1の回答の応用なので、解説は省略します。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.3

追記。 ANo1の回答では |1 |AAA|B | |2 |AAA|C | |3 |BBB|D | |4 |BBB|D | |5 |CCC|E | |6 |DDD|F | |7 |EEE|F | と言う状態での「ID6とID7の矛盾」は抽出できません。 「Aを基準にした時に、Bが矛盾してないか?」しか抽出しないので注意して下さい。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

解説。 クエリ1では「Aフィールドをグループ化した時の、グループごとのAの件数」を「CA1」として抽出しています。 クエリ2では「Aフィールド、Bフィールドをグループ化した時の、グループごとのAの件数」を「CA2」として抽出しています。 AフィールドとBフィールドに矛盾が無いなら「クエリ1のCA1」と「クエリ2のCA2」は「同じ値」になります。 AフィールドとBフィールドに矛盾があるなら「クエリ1のCA1」と「クエリ2のCA2」は「異なる値」になります。 なので、クエリ3で「クエリ1のCA1とクエリ2のCA2が異なる組み合わせのAとB」を抽出しています。つまり、クエリ3で「矛盾のあるAとB」を抽出しています。 最終的な結果クエリで、矛盾のあるレコードのID、A、Bを抽出しています。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.1

---クエリ1--- SELECT A, Count(A) AS CA1 FROM テーブル1 GROUP BY A; ---クエリ2--- SELECT A, B, Count(A) AS CA2 FROM テーブル1 GROUP BY A, B; ---クエリ3--- SELECT クエリ2.A, クエリ2.B FROM クエリ2 LEFT JOIN クエリ1 ON クエリ2.A = クエリ1.A WHERE (((クエリ1.CA1)<>クエリ2.CA2)); ---結果クエリ--- SELECT テーブル1.ID, テーブル1.A, テーブル1.B FROM テーブル1 INNER JOIN クエリ3 ON (テーブル1.B = クエリ3.B) AND (テーブル1.A = クエリ3.A) ORDER BY ID; 「クエリ1発」では不可能です。 作業用のクエリ1~クエリ3が必要です。

ticktak
質問者

お礼

解説までつけていただいて、また逆のパターンまでいただいて大変感謝です。ありがとうございます。

関連するQ&A

  • 最新レコードを抽出し外部結合する方法について

    お世話になります。 現在、最新レコードを抽出し外部結合するSQLを考えているのですが、実現できておりません。 実現できるSQLをご存知の方、いらっしゃいましたら情報を頂けますでしょうか。 # 私の使用しているのは、PostgreSQL8.3となります。 実現したい内容は、以下となります。  1.テーブルAから「名前」でグループ化して最新の「更新日付」のレコードを抽出。  2.1の結果とテーブルBを「名前」で結合。  3.テーブルAの「名前」、「点数」、「更新日付」とテーブルBの「判定」を抽出。    ⇒ただしテーブルAに情報がある場合は、テーブルBの判定結果を「0」にして出力。      テーブルA               テーブルB ----------------------------   -----------------------  名前| 点数| 更新日付       名前 | 判定  ----------------------------   ----------------------- AAA   98   2011/4/1        AAA   0  AAA   60   2011/4/3        BBB   1  BBB   70   2011/4/2        CCC   1  BBB   35   2011/4/4        DDD   1  DDD   98   2011/4/1        EEE   0  EEE   47   2011/4/5         FFF   0  GGG   80   2011/4/6        GGG   1    【出力結果】 ---------------------------------------------  名前 | 点数  | 更新日付 | 判定  --------------------------------------------- AAA    60     2011/4/3      0  BBB    35     2011/4/4     0(1⇒0に変更)  CCC   NULL     NULL       1  DDD    98     2011/4/1     0(1⇒0に変更)  EEE    47     2011/4/5      0  FFF    NULL     NULL       0  GGG    80     2011/4/6     0(1⇒0に変更) お手数お掛け致しますが、ご教示のほどよろしくお願い致します。

  • 重複レコードの抽出について

    以下のようなテーブルからmailが重複していてnameの値が全て同じ値を持つレコードを取得するためのSQL文を教えてください。 mail | name ----------- aaa | 01 aaa | 01 aaa | 01 bbb | 02 bbb | 02 bbb | 01 ccc | 01 ccc | 01 ccc | 02 select * from test where mail in (select mail from test where mail group by mail having count(mail)>1) 上記のSQL文だと以下のデータが取得されてしまいます。 ↓ mail | name ----------- aaa | 01 ○ aaa | 01 ○ aaa | 01 ○ bbb | 02 × bbb | 02 × ccc | 01 × ccc | 01 × ○印のみ取得したいのですが、 SQL文をどのように修正すればよいのでしょうか。 よろしくお願いいたします。

  • (EXCEL)重複したデーターの抽出について

    EXCEL2003 シート「sheet1」に下記のようなデーターがあります。 <sheet1>   A   B   C  D 1 りんご 青森 AAA BBB 2 みかん 愛媛 CCC DDD 3 みかん 青森 AAA BBB 4 りんご 青森 AAA BBB 5 みかん 愛媛 CCC DDD A列とB列が同じ値のものをシート「sheet2」に重複しているデーター は1行だけになり、E列にカウントした数が入力されるようにしたいです。 (C列やD列は同じ値でなくてもA列とB列が同じ値の時にカウントして抽出したいです) <sheet2>   A   B   C  D   E  りんご 青森 AAA BBB  2  みかん 愛媛 CCC DDD  2   ご教示のほどお願いします。

  • 異なるキーで取得したデータの合成

    SQLに関して質問です。 以下のようなテーブルA、Bがあった場合、 【テーブルA】  カラム1  カラム2  ------------------------  AAA   CCC  BBB   DDD 【テーブルB】  カラム3  カラム4  ------------------------  AAA   1  BBB   2  CCC   3  DDD   4 次のような結果を得るにはどのようなSQL文を記述すれば良いでしょうか? 【求める結果】  カラム1  カラム2 カラム4(1) カラム4(2)  ---------------------------------------------------  AAA   CCC    1      3  BBB   DDD    2      4 非常に初歩的な質問かもしれませんが宜しくお願いいたします。

  • SQLで○○の値以外を持っているレコードを抽出しないという条件を作りた

    SQLで○○の値以外を持っているレコードを抽出しないという条件を作りたいのですが・・・ 例えばこんな感じのテーブルがあったとします。 A1 A2 A3 -- -- -- AAA AA 111 AAA AB 111 AAA BB 222 BBB BB 111 CCC AA 111 CCC AC 555 DDD BB 222 EEE AA 111 EEE AC 333 EEE BB 777 A2の列に「BB」の値"しか"持っていないレコードを抽出したいのです このテーブルで言えば返りは BBB BB 111 DDD BB 222 と期待しています。 値BBのみしか持ってない条件の作り方を御教示願えませんでしょうか。 また、A2の値も文字数以外は規則性があるわけではないので無限パターンです。 詳しい方よろしくお願いします。

  • 分岐SQLを一発のSQLで実現したい

    【データベース:SQLServer2005】 SQLのアドバイスを頂きたいです。 【テーブル】 テーブル名:Table1 フィールド名:種類、キー1、キー2 テーブル名:Table2 フィールド名:種類、キー1、キー2 テーブル名:Table3 フィールド名:種類、キー1、キー2 【データ】 Table1 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD Table2 種類、キー1、キー2 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD Table3 種類、キー1、キー2 NULL  AAA  BBB NULL  AAA  CCC NULL  AAA  DDD これをUNIONで取得します。 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD NULL  AAA  BBB NULL  AAA  CCC 実現したいのは、 1)同種類、キー1、キー2のデータで、 種類にNULLが含まれていたら、NULLのデータは取得しない 2)同種類、キー1、キー2のデータで、 種類にNULLしかないデータは、取得する 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD →いる NULL  AAA  BBB →いらない NULL  AAA  CCC →いらない ↓結果 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD 上記を実現する為、UNION後のSQLでも構わないので、 一発のSQLで取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。

  • Excelで同一のデータを抽出して横並びに

    A     B  C     D 商品コード 注文数  商品コード 注文数 aaa     15  ccc     4 bbb      12  ddd     6 ccc     10  aaa     22 ddd     6   eee     10 eee     5   bbb     7 fff       8 kkk 9 kkk 7 lll 4 上記のようなデータを 以下のように同じ商品コードを横並びに表示させたいのですが どういったcountifとかで試したのですが上手くいかず、どのような関数を使えば可能でしょうか? A     B  C     D 商品コード 注文数  商品コード 注文数 aaa     15  aaa     22 bbb      12  bbb     7 ccc     10  ccc     4 ddd     6   ddd     6 eee     5   eee     10 fff       8 kkk 7 kkk 9 lll 4 宜しくお願い致します。

  • SELECT~JOIN文での抽出結果の導き出し方

    お世話になりますm(__)m SELECT文でJOINした時の抽出結果を出す方法がわかりません(>_<) たとえば、以下の2つのテーブルがあり、 求めている(欲しい)結果を記します。 テーブル:table_a id|genre| 1 |和食 | 2 |中華 | 3 |イタリアン| 4 |フレンチ| テーブル:table_b table_a_id|etc1|etc2| 123 |aaa |ああ| 23 |bbb |いい| 1 |ccc |うう| 2 |ddd |ええ| 求めている(欲しい)結果 id|genre |etc1|etc2| 1 |和食,中華,イタリアン |aaa |ああ| 2 |中華,イタリアン |bbb |いい| 3 |和食 |ccc |うう| 4 |中華 |ddd |ええ| 上記のような抽出結果を導き出すことは可能なのでしょうか?? 非常に汚い書き方で見にくく申し訳ありませんが、お詳しい方、是非ともご教授のほどお願いしますm(__)m

    • ベストアンサー
    • MySQL
  • 重複レコードをグループ化したいけど…。

    度々お世話になってます。 table1 【ID|フィールド1】 [1|AAA] [1|BBB] [2|CCC] [3|DDD] [3|EEE] [3|FFF] というようなテーブルがあるとして、クエリでは <table> <tr><td>1</td><td>AAA<br>BBB</td></tr> <tr><td>2</td><td>CCC</td></tr> <tr><td>3</td><td>DDD<br>EEE<br>FFF</td></tr> </table> …という形で表示したいのです。(理想です) 今までいろいろ試してみて、 $sql = " SELECT ID,フィールド FROM table1 GROUP BY ID "; に行き着きましたが、これだと <table> <tr><td>1</td><td>AAA</td></tr> <tr><td>2</td><td>CCC</td></tr> <tr><td>3</td><td>DDD</td></tr> </table> というように表示され、表示されないレコードが出来てしまいます。 GROUP BYが余計!と言われそうですが、同じIDが複数並ぶのを避けたいのです。 ソースコードは、 print "<table>\n"; print "<tr><th>ID</th><th>フィールド</th></tr>\n";  while( $row = mysql_fetch_array($result) ) {  print "<tr><td>$row[ID]</td><td>$row[フィールド]</td></tr>\n";  } print "</table>\n"; になっている状態です。 $row[フィールド]を書き換えればいいのかな?と思いますが、検索してもそれらしいものは見当たらなかったので質問させていただきました。 心当たりのある方、よろしくおねがいします。

    • ベストアンサー
    • PHP
  • SQL 複数条件を設定

    PostgreSQLを使用しております。 それぞれ、TABLE1とTABLE1があり、 TABLE1 a-1   a-2   b-1    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd      2   ggg   bbb   ccc        3   bbb   mmm  ddd       4   ggg   mmm  ccc    : TABLE2   a-1   a-2        c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄     1   bbb   aaa        eee         2   ggg   mmm       qqq    : 質問1. TABLE1.a-1=TABLE2.a-1 and TABLE1.a-2=TABLE2.a-2 を条件にして結合 したい場合、どのように結合すればよいのか。 期待結果 a-1   a-2   b-1  c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd  eee    2   ggg   bbb   ccc   ※    3   bbb   mmm  ddd   ※    4   ggg   aaa   ccc   qqq ※は空白でもNULLでもよい 質問2. 上記が可能な場合にさらに質問です。 TABLE1およびTABLE2が、SELECT,WHEREによって抽出されたものとした場合、 1つのSQL文で質問1と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。

専門家に質問してみよう