Отберите мужчин старше 18 лет и проверьте через EXISTS наличие заказа товара производителя X. EXISTS не размножает пользователя при нескольких подходящих заказах.
Мужчины старше 18 лет
Отберите мужчин старше 18 лет и проверьте через EXISTS наличие заказа товара производителя X. EXISTS не размножает пользователя при нескольких подходящих заказах.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо отобрать всех мужчин, которым более 18 лет и которые оформили заказ продукции, произведённой фирмой 'X'.
User(id, name, sex, birthday)
Product(id, maker, model, type)
Order(user_id, product_id, date, count, code, price, total_sum)
Ответ
Отберите мужчин старше 18 лет и проверьте через EXISTS наличие заказа товара производителя X. EXISTS не размножает пользователя при нескольких подходящих заказах.
Пример для PostgreSQL; предполагается sex = 'M' и birthday типа date:
SELECT u.*
FROM "User" u
WHERE u.sex = 'M'
AND u.birthday < (CURRENT_DATE - INTERVAL '18 years')::date
AND EXISTS (
SELECT 1
FROM "Order" o
JOIN "Product" p ON p.id = o.product_id
WHERE o.user_id = u.id AND p.maker = 'X'
);
Здесь «старше 18» означает уже прошедший 18-й день рождения; ровно сегодня исполнившиеся 18 исключены. Если нужен полный возраст больше 18, граница другая — 19 лет. Регистр имён таблиц и код пола необходимо согласовать с реальной схемой.