Создаю следующие таблицы:

create table customers
(
        ID             varchar(9),
        name           varchar(15),  

CONSTRAINT pk_id PRIMARY KEY (ID)
);


create table living_places
(
        code     varchar(7),
        ID      varchar(9),

CONSTRAINT pk_code PRIMARY KEY (code)
);

create table policies
(
        code_policy         varchar(7),
        code_living_place       varchar(7),

CONSTRAINT pk_code_policy PRIMARY KEY (code_policy)
);

create table accidents
(
        code_accident         varchar(7),
        code_policy       varchar(7),

CONSTRAINT pk_code_accident PRIMARY KEY (code_accident)
);

Я вставил следующие даты:

insert into customers(ID, name) 
values('fx1','Louis');
insert into customers(ID, name) 
values('fx2','Peter');
insert into customers(ID, name) 
values('fx3','Alice');

insert into living_places(code, ID) 
values('001','fx1');
insert into living_places(code, ID) 
values('002','fx2');
insert into living_places(code, ID) 
values('003','fx1');
insert into living_places(code, ID) 
values('004','fx3');

insert into policies(code_policy, code_living_place) 
values('p1','001');
insert into policies(code_policy, code_living_place) 
values('p2','002');
insert into policies(code_policy, code_living_place) 
values('p3','003');

insert into accidents(code_accident, code_policy) 
values('A1','p1');
insert into accidents(code_accident, code_policy) 
values('A2','p2');

Возникает вопрос: как выбрать клиентов, которые не попали в аварию ни в одной из своих политик?

Моя проблема в том, что когда я пытался использовать "не в". Имея хотя бы одну политику «Луи» в таблице «несчастные случаи», запрос покажет мне «Луи» и не должен показывать «Луи».

Мой запрос:

create or replace view view as
select code from living_places v where code not in (
  select distinct a.code_living_place  from 
    policies as a inner join accidents as c 
    on a.code_policy = c.code_policy 
);

select name from customers where ID in (select ID from living_places where code in (select code from view where code in (select code_living_place from policies)));

MySQL вернет меня:

+-------+
| name  |
+-------+
| Louis |
+-------+
1
Python241820 6 Май 2016 в 11:25

2 ответа

Лучший ответ

Использовать не внутри и внутреннее соединение

select name from customers 
where customers.id not in (select living_places.id 
        from living_places
        inner join policies on policies.code_living_place = living_places.code
        inner join accidents on accidents.code_policy =  policies.code_policy);
1
scaisEdge 6 Май 2016 в 08:44
Select name FROM customers WHERE ID NOT IN (
    Select v.ID FROM
    accidents a, policies p, living_places v
    WHERE a.code_policy = p.code_policy
    AND p.code_living_place = v.code
)
1
Maruli 6 Май 2016 в 08:43