みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

重複データの抽出方法(複数項目)

以下のようなテーブルからc列とd列のデータが重複しているレコードを取得したいために、以下のSQLを試してみました。

a列|b列|c列|d列
---|---|---|---
01 |01 |01 |01
02 |01 |01 |01
03 |02 |01 |03
04 |02 |02 |03
05 |01 |01 |02
06 |02 |02 |03

select * from テスト
where c in (select c from テスト group by c,d having count(*)>1)
and d in (select d from テスト group by c,d having count(*)>1)

そうしたところ、以下の結果になってしまいました。
想定では、○のレコードだけ抽出できると思ったのです。
×のレコードを抽出したくないのですが、SQLのどこが
間違っているのでしょうか?

a列|b列|c列|d列
---|---|---|---
01 |01 |01 |01 ○
02 |01 |01 |01 ○
03 |02 |01 |03 ×
04 |02 |02 |03 ○
06 |02 |02 |03 ○

(使用DB)SQLServer2000

投稿日時 - 2006-07-05 09:47:40

QNo.2256542

困ってます

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

>SQLのどこが間違っているのでしょうか?

最初の条件では、c列の値が01、02がヒットします。
二つ目の条件では、d列の値が、01、03がヒットします。
これにより、c列=01 & d列=03の行もヒットしてしまいます。
つまり、c列の値とd列の値の組で、「2件以上あるもの」という条件になっていません。

以下にSQL例を示します。

select * from t1 x
where exists
(select * from t1 where x.c=c and x.d=d group by c,d having count(*)>1)

投稿日時 - 2006-07-05 14:53:33

お礼

existsやサブクエリーの書き方が勉強不足でした。
大変参考になりました。

ありがとうございました。

投稿日時 - 2006-07-06 09:24:34

このQ&Aは役に立ちましたか?

13人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

スーツのデザイナーでプログラマではありません。
一応、SQL Server に次に SQL文を発行しフォームに表示して確認しています。
ミスの可能性もあります。
検証して下さい。

select * from Table1
where str(Cc) + str(DD) in (select str(CC) + str(DD) from Table1 group by CC,DD having count(*)>1)

ID  aa  bb  cc  dd
1   1   1   1  1
2   2   1   1  1
3   3   1   1  3
4   4   2   2  3
5   5   1   1  2
6   6   2   2  3

一応、これで!

No.|ID|aa|bb|cc|dd|
 1| 1|1 |1 |1 |1 |
 2| 2|2 |1 |1 |1 |
 3| 4|4 |2 |2 |3 |
 4| 6|6 |2 |2 |3 |

CC+DD が重複しているか否かに条件を訂正したつもりです。

投稿日時 - 2006-07-05 10:29:10

お礼

複数項目を文字列として1項目にしているのですね。
確かにこのSQLで抽出できました。

ありがとうございました。

投稿日時 - 2006-07-06 09:23:30