以下のサンプルに単純化したいくつかの値の選択に問題があります。基本的に、次のようなテーブルがあります。
CREATE TABLE sample_table
(
pk_id NUMBER,
business_id NUMBER
)
このテーブルの一部の business_id が重複しているため、それらのレコードの pk を知る必要があります。
私が(さらに)次のようにテーブルを作成して埋めるとしましょう:
ALTER TABLE sample_table ADD (
CONSTRAINT sample_table_PK
PRIMARY KEY
(pk_id));
create sequence sample_sequence;
create trigger sample_trigger before insert on sample_table for each row
begin
:new.pk_id := sample_sequence.nextval;
end;
insert into sample_table (business_id) values (1000);
insert into sample_table (business_id) values (1001);
insert into sample_table (business_id) values (1002);
insert into sample_table (business_id) values (1003);
insert into sample_table (business_id) values (1003);
insert into sample_table (business_id) values (1004);
重複している business_id を特定するのは簡単です。
SELECT business_id, COUNT (business_id)
FROM sample_table
GROUP BY business_id
HAVING COUNT (business_id) > 1;
しかし、business_id は必要ありません。pk_id が必要です。
上記のクエリをサブクエリとして使用して取得できます。
select * from sample_table where business_id in (
SELECT business_id
FROM sample_table
GROUP BY business_id
HAVING COUNT (business_id) > 1);
またはサブクエリファクタリングで COUNT ( * ) OVER PARTITION BY を使用する
with q as
(SELECT business_id, COUNT ( * ) OVER (PARTITION BY business_id) totalcount
FROM sample_table)
select * from q
where q.totalcount > 1
しかし、どちらもクエリをかなり遅くします (このサンプルのクエリは問題なく動作しますが、約 500.000 行の運用データを扱う場合、パフォーマンスはそれほど高くありません)。