1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
create table t_person (
id number(19,0) primary key,
name varchar2(256 char)
);
create table t_contract(
id number(19,0) primary key,
person_id number(19,0) constraint fk_contract_person references t_person(id),
name varchar2(256 char)
);
create table t_dossier (
id number(19,0) primary key,
contract_id number(19,0) constraint fk_dossier_contract references t_contract(id),
name varchar2(256 char)
);
insert into t_person(id, name) values(1,'person with 1 contract 0 dossier') ;
insert into t_person(id, name) values(2,'person with 1 contract 1 dossier') ;
insert into t_person(id, name) values(3,'person with 1 contract 2 dossier') ;
insert into t_person(id, name) values(4,'person with 2 contract each 1 dossier') ;
insert into t_person(id, name) values(5,'person with 3 contract (0,1,2) dossier') ;
insert into t_contract(id, person_id, name) values(1,1,'contract of p 1') ;
insert into t_contract(id, person_id, name) values(2,2,'contract of p 2') ;
insert into t_contract(id, person_id, name) values(3,3,'contract of p 3') ;
insert into t_contract(id, person_id, name) values(4,4,'contract 1 of p 4') ;
insert into t_contract(id, person_id, name) values(5,4,'contract 2 of p 4') ;
insert into t_contract(id, person_id, name) values(6,5,'contract 1 of p 5') ;
insert into t_contract(id, person_id, name) values(7,5,'contract 2 of p 5') ;
insert into t_contract(id, person_id, name) values(8,5,'contract 3 of p 5') ;
insert into t_dossier(id, contract_id, name) values(1,2,'dossier of contract 1 of p 2') ;
insert into t_dossier(id, contract_id, name) values(2,3,'dossier 1 of contract 1 of p 3') ;
insert into t_dossier(id, contract_id, name) values(3,3,'dossier 2 of contract 1 of p 3') ;
insert into t_dossier(id, contract_id, name) values(4,4,'dossier 1 of contract 1 of p 4') ;
insert into t_dossier(id, contract_id, name) values(5,5,'dossier 1 of contract 2 of p 4') ;
insert into t_dossier(id, contract_id, name) values(6,7,'dossier 1 of contract 2 of p 5') ;
insert into t_dossier(id, contract_id, name) values(7,8,'dossier 1 of contract 3 of p 5') ;
insert into t_dossier(id, contract_id, name) values(8,8,'dossier 2 of contract 3 of p 5') ;
with persons as (
select p.id from t_person p
join t_contract c on c.person_id = p.id
join t_dossier d on d.contract_id = c.id
group by p.id, c.id
having count(distinct c.id || '-' || d.id) > 1
)
select * from t_person where id in (select id from persons)
; |