Создаю следующие таблицы:
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 |
+-------+
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);
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
)
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными. В вопросе всегда указывайте точную версию сервера. Версии 5.x сильно отличаются по своим возможностям от версий 8+.