Делегаты клиентов: найти по INN/KPP, вывести имя и телефон

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;