17. Найти делегатов клиента по ИНН и КПП
Условие задачи:
Даны таблицы клиентов и их делегатов.
Необходимо по inn и kpp клиента найти всех связанных с ним делегатов и вывести:
full_name— полное имя;phone— номер телефона.
Код:
CREATE TABLE KF_ADAPTER_R_CLIENT (
id SERIAL PRIMARY KEY,
abs_id VARCHAR(255),
branch_id VARCHAR(255),
abs_branch_id VARCHAR(255),
short_name VARCHAR(255),
inn VARCHAR(12),
kpp VARCHAR(9),
sign_count INT,
deleted BOOLEAN
);
CREATE TABLE KF_ADAPTER_R_DELEGATE (
id SERIAL PRIMARY KEY,
client_id INT,
abs_id VARCHAR(255),
user_id VARCHAR(255),
full_name VARCHAR(255),
phone VARCHAR(15),
sign_role VARCHAR(50),
deleted BOOLEAN,
FOREIGN KEY (client_id)
REFERENCES KF_ADAPTER_R_CLIENT(id)
);
Спойлеры к решению
Подсказки
💡 Таблицы связаны по
💡 Для объединения используй
💡 Фильтруй клиента по
💡 Если удалённых делегатов выводить не нужно, добавь
KF_ADAPTER_R_DELEGATE.client_id = KF_ADAPTER_R_CLIENT.id.💡 Для объединения используй
JOIN.💡 Фильтруй клиента по
inn и kpp.💡 Если удалённых делегатов выводить не нужно, добавь
deleted = FALSE.Решение
SELECT
d.full_name,
d.phone
FROM KF_ADAPTER_R_DELEGATE d
JOIN KF_ADAPTER_R_CLIENT c
ON c.id = d.client_id
WHERE c.inn = '7701234567'
AND c.kpp = '770101001'
AND d.deleted = FALSE;
JOIN связывает делегатов с клиентами по client_id.
Условия:
c.inn = '7701234567'
AND c.kpp = '770101001'
выбирают нужного клиента, а:
d.deleted = FALSE
исключает удалённых делегатов.
Если запрос вызывается из приложения, значения лучше передавать параметрами:
SELECT
d.full_name,
d.phone
FROM KF_ADAPTER_R_DELEGATE d
JOIN KF_ADAPTER_R_CLIENT c
ON c.id = d.client_id
WHERE c.inn = :inn
AND c.kpp = :kpp
AND d.deleted = FALSE;