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

zyoni
2013-11-27 14:19 2034 1
以下のようなテーブルから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

コメント

2013年 12月 04日 (20:56)
こんにちは。
イノ(inno)です。

GROUP BY句とJOINを利用すれば簡単にできます。
下記のSQLを実行してみてください。


-- #### 一時テーブル作成
CREATE TABLE dbo.TempA
(
StrA varchar(10)
,StrB varchar(10)
,StrC varchar(10)
,StrD varchar(10)
)
GO

-- #### テストデータ登録
INSERT INTO dbo.TempA
SELECT '01', '01', '01', '01' UNION ALL
SELECT '02', '01', '01', '01' UNION ALL
SELECT '03', '02', '01', '03' UNION ALL
SELECT '04', '02', '02', '03' UNION ALL
SELECT '05', '01', '01', '02' UNION ALL
SELECT '06', '02', '02', '03'


-- #### 結果
SELECT B.*
FROM
(
SELECT StrC, StrD, COUNT(StrA) Cnt
FROM dbo.TempA
GROUP BY StrC, StrD
HAVING COUNT(StrA) > 1
) AS A JOIN dbo.TempA AS B
ON A.StrC = B.StrC AND A.StrD = B.StrD