Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задача по SQL

евгений слончак Ученик (191), на голосовании 1 год назад
Для каждого гражданина вывести ФИО, его действующий адрес, почтовый индекс тремя отдельными колонками. Адрес является действующим, если дата выписки не установлена, а дата прописки максимальная. При наличии нескольких действующих адресов брать наиболее актуальный (с максимальным id прописки).
Запрос сделать параметризуемым – в зависимости от значения p_mode:
p_mode=1 организовать поиск граждан с действующим местом жительства на текущий момент
p_mode=0 вывести всех граждан (вне зависимости от того указан ли у них действующий адрес)
p_mode=-1 организовать поиск граждан без определенного места жительства
Голосование за лучший ответ
Татьяна Просветленный (36384) 1 год назад
Для решения задачи по SQL необходимо выполнить следующие шаги:
  1. Вывести ФИО, действующий адрес и почтовый индекс граждан. Адрес является действующим, если дата выписки не установлена, а дата прописки максимальная. При наличии нескольких действующих адресов брать наиболее актуальный (с максимальным id прописки).
  2. Сделать запрос параметризуемым в зависимости от значения p_mode:
  • p_mode=1: организовать поиск граждан с действующим местом жительства на текущий момент.
  • p_mode=0: вывести всех граждан (вне зависимости от того указан ли у них действующий адрес).
  • p_mode=-1: организовать поиск граждан без определенного места жительства.
Для выполнения первого шага запроса можно использовать следующий код:
 SELECT citizens.FIO, addresses.address, addresses.postal_code 
FROM citizens
JOIN addresses ON citizens.id = addresses.citizen_id
WHERE addresses.checkout_date IS NULL
AND addresses.registration_date = (
SELECT MAX(registration_date)
FROM addresses
WHERE citizen_id = citizens.id
AND checkout_date IS NULL
)
Для выполнения второго шага запроса можно использовать следующий код:
 DECLARE @p_mode INT 
SET @p_mode = 1 -- здесь можно задать значение p_mode

SELECT citizens.FIO, addresses.address, addresses.postal_code
FROM citizens
JOIN addresses ON citizens.id = addresses.citizen_id
WHERE (@p_mode = 0 OR addresses.checkout_date IS NULL)
OR (@p_mode = 1 AND addresses.checkout_date IS NULL)
OR (@p_mode = -1 AND addresses.checkout_date IS NOT NULL)
AND addresses.registration_date = (
SELECT MAX(registration_date)
FROM addresses
WHERE citizen_id = citizens.id
AND (@p_mode = 0 OR checkout_date IS NULL)
)
Обратите внимание, что в запросе используется оператор OR для проверки значения p_mode. Также в запросе используется параметр @p_mode, который можно задать перед выполнением запроса.
Похожие вопросы