プロが教えるわが家の防犯対策術!

以下のようなテーブルから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

A 回答 (2件)

>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)
    • good
    • 4
この回答へのお礼

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

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

お礼日時:2006/07/06 09:24

スーツのデザイナーでプログラマではありません。


一応、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 が重複しているか否かに条件を訂正したつもりです。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2006/07/06 09:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す