Задать вопрос
@aero0

Правильно ли написан SQL-запрос для вывода клиентов с действующими (непогашенными) кредитами?

Решаю учебную задачу по SQL.
Нужно вывести список клиентов с действующими (непогашенными) кредитами, используя 3 таблицы:
– t1 (кредитные контракты),
– t2 (депозитные контракты),
– t3 (клиенты).

Ниже привожу структуру и данные таблиц (MySQL 5.7):

CREATE TABLE t1 (
    CREDIT_CONTRACT_ID INT,
    START_DATE DATE,
    END_DATE DATE,
    CUSTOMER_ID INT,
    CREDIT_AMOUNT INT
);

INSERT INTO t1 VALUES 
(1, '2015-10-15', '2015-12-30', 1, 1000),
(2, '2015-12-14', NULL, 2, 2000),
(3, '2015-10-20', NULL, 3, 15000),
(7, '2015-12-28', NULL, 4, 80000),
(8, '2015-10-07', NULL, 5, 3000),
(9, '2015-06-30', NULL, 6, 29000),
(10, '2015-04-09', NULL, 7, 8000),
(11, '2015-01-20', NULL, 8, 68000),
(12, '2015-10-27', NULL, 9, 7000);

CREATE TABLE t3 (
    CUSTOMER_ID INT,
    NAME VARCHAR(100),
    BIRTH_DATE DATE,
    CITY VARCHAR(100)
);

INSERT INTO t3 VALUES 
(1, 'Серик', '1975-09-20', 'Алматы'),
(2, 'Динара', '1977-07-22', 'Алматы'),
(3, 'Марат', '1969-01-02', 'Астана'),
(4, 'Олег', '1967-09-27', 'Астана'),
(5, 'Марина', '1969-10-12', 'Алматы'),
(6, 'Дильшат', '1979-10-08', 'Караганда'),
(7, 'Ануар', '1982-04-17', 'Кызылорда'),
(8, 'Михаил', '1980-12-11', 'Атырау'),
(9, 'Екатерина', '1987-02-12', 'Актобе');

Мой запрос:

SELECT 
    t3.NAME,
    t3.BIRTH_DATE,
    t3.CITY,
    t1.CREDIT_CONTRACT_ID,
    t1.START_DATE,
    t1.END_DATE,
    t1.CREDIT_AMOUNT
FROM t1
JOIN t3 ON t1.CUSTOMER_ID = t3.CUSTOMER_ID
WHERE t1.END_DATE IS NULL;

По идее, я ищу кредиты, у которых END_DATE не указана (то есть кредит ещё не погашен).
Результат запроса выглядит логично, но хочу убедиться, что это корректный и оптимальный способ.
Может быть, есть нюансы или альтернативные подходы?
  • Вопрос задан
  • 168 просмотров
Подписаться 1 Простой 5 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Инженер по тестированию
    5 месяцев
    Далее
  • Яндекс Практикум
    Java-разработчик
    10 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик расширенный
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
Ваш запрос выводит список к. договоров, со сведениями о клиентах.
Если нужен именно список клиентов, у которых есть действующие к. договоры (без подробностей), то нужен такой запрос:
SELECT t3.*
FROM t3 
WHERE exists (select *
              from t1
            where t1.CUSTOMER_ID = t3.CUSTOMER_ID
                and t1.END_DATE IS NULL);

Решение задачи зависит от формата вывода данных. В каждом случае запрос может сильно отличаться. В некоторых случаях нужно часть данных получать декларативно, а ответ формировать процедурно.
у которых END_DATE не указана (то есть кредит ещё не погашен)

Судя по выборке, оно так и есть. Но это лишь один шаг решения.
что это корректный и оптимальный способ

Если вы создадите индексы на поля t1.CUSTOMER_ID, t3.CUSTOMER_ID, t1.END_DATE, то вы решите кейс "оптимально", какой бы запрос не использовался.
Ответ написан
Комментировать
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
Ваш запрос правильно выводит непогашенные контракты, дополненные информацией о клиентах. Но в вопросе не список контрактов, а список клиентов.
SELECT DISTINCT
    t3.*
FROM t1
INNER JOIN t3 ON t1.CUSTOMER_ID = t3.CUSTOMER_ID
WHERE t1.END_DATE IS NULL;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы