CREATE TABLE x#user(
id NUMBER PRIMARY KEY, --идентификатор гражданина
C_FIO varchar2(100) --ФИО гражданина – формат строки: фамилия, имя, отчество через запятую
CHECK(REGEXP_LIKE (C_FIO,'^[А-ЯЁ][а-яё]+,[А-ЯЁ][а-яё]+,[А-ЯЁ][а-яё]+$'))
);
--вставка пользователей
INSERT INTO x#user VALUES (1, 'Иванов,Иван,Иванович');
INSERT INTO x#user VALUES (2, 'Сидоров,Пётр,Иванович');
INSERT INTO x#user VALUES (3, 'Чехов,Павел,Михайлович');
INSERT INTO x#user VALUES (4, 'Соколова,Наталья,Степановна');
INSERT INTO x#user VALUES (5, 'Рубцов,Виктор,Иванович');
INSERT INTO x#user VALUES (6, 'Петров,Иван,Николаевич');
INSERT INTO x#user VALUES (7, 'Маршак,Самуил,Яковлевич');
INSERT INTO x#user VALUES (8, 'Гагарин,Юрий,Алексеевич');
INSERT INTO x#user VALUES (9, 'Багров,Данила,Сергеевич');
INSERT INTO x#user VALUES (10, 'Барто,Агния,Львовна');
INSERT INTO x#user VALUES (11, 'Пахмутова,Александра,Николаевна');
INSERT INTO x#user VALUES (12, 'Черкасский,Давид,Янович');
CREATE TABLE x#address(
id number primary key, --идентификатор адреса прописки
c_address varchar2(4000) --формат адреса: город, улица, дом, квартира, почтовый индекс в указанном порядке через запятую
CHECK(REGEXP_LIKE (c_address,'^[А-ЯЁ][а-яё][^\\/:*?"<>|]++,[А-ЯЁ][а-яё][^\\/:*?"<>|]++,[0-9]+,[0-9]+,[0-9]{6}$'))
);
INSERT INTO x#address VALUES (1, 'Сызрань,Ильича,15,12,675485');
INSERT INTO x#address VALUES (2, 'Москва,Свободы,10,30,123444');
INSERT INTO x#address VALUES (3, 'Москва,Тверская,22,18,123344');
INSERT INTO x#address VALUES (4, 'Москва,Кольцевая,1,100,125555');
INSERT INTO x#address VALUES (5, 'Кунгур,Бочкарева,170,1,617475');
INSERT INTO x#address VALUES (6, 'Самара,Восточная,40,0,332445');
INSERT INTO x#address VALUES (7, 'Оренбург,Челюскенцев,7,2,460005');
INSERT INTO x#address VALUES (8, 'Саратов,Пролетарская,55,44,685478');
INSERT INTO x#address VALUES (9, 'Пермь,Майская,1,1,458796');
INSERT INTO x#address VALUES (10, 'Пермь,Ленина,27,42,458796');
INSERT INTO x#address VALUES (11, 'Ленинград,Невский,43,120,645966');
INSERT INTO x#address VALUES (12, 'Санкт-Петербург,Староколенный,3,10,645900');
INSERT INTO x#address VALUES (13, 'Москва,Шаболовка,37,1,125555');
INSERT INTO x#address VALUES (14, 'Москва,Театральная,66,102,123445');
CREATE TABLE x#user_on_adress(
id number primary key, --идентификатор прописки
c_user number not null, --идентификатор гражданина
c_address number not null, --идентификатор адреса прописки
c_begin date not null, --дата прописки
c_end date --дата выписки
);
ALTER TABLE x#user_on_adress
ADD CONSTRAINT FK_userOnAdress
FOREIGN KEY (c_user) REFERENCES x#user(id);
ALTER TABLE x#user_on_adress
ADD CONSTRAINT FK_address
FOREIGN KEY (c_address) REFERENCES x#address(id);
INSERT INTO x#user_on_adress VALUES (1, 1, 1, to_date('20.07.1987','dd.mm.yyyy'),null);
INSERT INTO x#user_on_adress VALUES (2, 2, 2, to_date('15.04.1993','dd.mm.yyyy'),null);
INSERT INTO x#user_on_adress VALUES (3, 3, 5, to_date('01.09.1980','dd.mm.yyyy'),null);
INSERT INTO x#user_on_adress VALUES (4, 4, 6, to_date('10.02.2001','dd.mm.yyyy'),null);
INSERT INTO x#user_on_adress VALUES (5, 5, 8, to_date('20.05.1995','dd.mm.yyyy'),null);
INSERT INTO x#user_on_adress VALUES (6, 6, 9, to_date('08.08.2003','dd.mm.yyyy'),null);
INSERT INTO x#user_on_adress VALUES (7, 7, 11, to_date('20.06.1930','dd.mm.yyyy'),to_date('01.01.1969','dd.mm.yyyy'));
INSERT INTO x#user_on_adress VALUES (8, 8, 7, to_date('21.03.1959','dd.mm.yyyy'),to_date('01.04.1960','dd.mm.yyyy'));
INSERT INTO x#user_on_adress VALUES (9, 8, 3, to_date('15.08.1963','dd.mm.yyyy'),null);
INSERT INTO x#user_on_adress VALUES (10,9, 12, to_date('30.01.1994','dd.mm.yyyy'),null);
INSERT INTO x#user_on_adress VALUES (11,12,13, to_date('11.10.1972','dd.mm.yyyy'),to_date('17.11.2008','dd.mm.yyyy'));
INSERT INTO x#user_on_adress VALUES (12,11,14, to_date('05.03.1966','dd.mm.yyyy'),null);
INSERT INTO x#user_on_adress VALUES (13,1, 10, to_date('20.07.1986','dd.mm.yyyy'),null);
with param as (select 1 p_mode from dual)
, allRes as (select u.C_FIO,
ua.id, ua.c_user,
replace(ad.c_address, SUBSTR(ad.c_address, LENGTH(ad.c_address) - 6, 7),'') as adress,
SUBSTR(ad.c_address, LENGTH(ad.c_address) - 5, 6) as ind
from x#user u
left join x#user_on_adress ua on u.id=ua.c_user
left join x#address ad on ad.id=ua.c_address)
select C_FIO as ФИО,
adress as Адрес,
ind as Индекс
from allRes ar
left join param on 1=1
left join (select max(ua.id) as id, ua.c_user
from allRes ua
group by ua.c_user) ua on ar.c_user=ua.c_user
where
case when p_mode = -1 and adress is null then 1
when p_mode = 1 and ua.id = ar.id then 1
when p_mode = 0 and adress is not null then 1 end = 1;