- ベストアンサー
重複していないレコードの抽出方法について
下記のテーブルでフィールド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 | ―――――――――― よろしくお願いします。
- ticktak
- お礼率51% (192/376)
- その他MS Office製品
- 回答数5
- ありがとう数2
- みんなの回答 (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;
その他の回答 (4)
- chie65535
- ベストアンサー率43% (8519/19367)
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)
追記。 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)
解説。 クエリ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)
---クエリ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が必要です。
お礼
解説までつけていただいて、また逆のパターンまでいただいて大変感謝です。ありがとうございます。
関連する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に変更) お手数お掛け致しますが、ご教示のほどよろしくお願い致します。
- ベストアンサー
- PostgreSQL
- 重複レコードの抽出について
以下のようなテーブルから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 非常に初歩的な質問かもしれませんが宜しくお願いいたします。
- ベストアンサー
- Oracle
- 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で取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。
- ベストアンサー
- SQL Server
- 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 宜しくお願い致します。
- ベストアンサー
- Excel(エクセル)
- 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と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。
- ベストアンサー
- PostgreSQL
お礼
どうもありがとうございます。 自分のレベルでは理解するのが初めは難しいかと思いましたが、分解してみると納得いきました。 ありがとうございました。