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

Oracle 10gを使用しております。
SELECT DISTINCTを使用すると重複している行を
除いた結果を得ることが出来ますが、
逆に重複している行のみを得るには
どのようにすればよいのでしょうか?
ご教授お願い致します。

A 回答 (1件)

以下のような方法で判断しているのが多いと思います。



(1)重複しているキーの判別

select deptno,count(*)
from emp
group by deptno
having count(*) > 1;

「group by」で重複しているかを判断する項目を指定し集計を行う。集計結果から「having句」で「count(*) 」の結果を「 > 1」に当てはまるものだけを抽出する。

(2) 1の結果から得た重複項目をWhere句として利用し、重複行を全表示する。

select * from emp
where deptno in(
select deptno
from emp
group by deptno
having count(*) > 1
);


※10gだと分析ファンクションが使えるので以下のような書き方も可能。

select * from
(
select a.* ,COUNT(*) OVER (partition BY deptno) count
from emp a
)
where count > 1;

サブクエリ内でcountを分析ファンクションとして使用して、「partition BY 」で集計する項目を指定する。その結果にWhere句で「> 1」を指定して重複行を省く。

要件にあって効率の良い方法を試してください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご教授頂いた通りしましたら、
希望していたことが出来ました。

お礼日時:2008/06/26 10:57

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