Используйте EXISTS с условием amount>0: он проверяет наличие товара и не размножает строку клиента при нескольких позициях в корзине.
Клиенты, у которых в корзине есть товары
Используйте EXISTS с условием amount>0: он проверяет наличие товара и не размножает строку клиента при нескольких позициях в корзине.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо вывести список клиентов (id, email), у которых в таблице корзин присутствует хотя бы один товар (по полю amount).
-- Table "public.carts"
-- Column | Type | Modifiers
-- -----------|-----------------------------|-----------------------------
-- sku | bigint | not null
-- country | country_enum | not null
-- customer_id| bigint |
-- amount | bigint | not null
-- updated_at | timestamp without time zone| default now()
-- Table "public.customer"
-- Column | Type | Modifiers
-- -------|-------|----------------
-- id | bigint| not null
-- email | text | not null
Ответ
Используйте EXISTS с условием amount>0: он проверяет наличие товара и не размножает строку клиента при нескольких позициях в корзине.
Запрос для приведённой схемы:
SELECT c.id, c.email
FROM public.customer AS c
WHERE EXISTS (
SELECT 1
FROM public.carts AS cart
WHERE cart.customer_id = c.id
AND cart.amount > 0
);
Строка корзины с нулевым или отрицательным amount не считается наличием товара. NULL customer_id ни с кем не соединится. Для частых запросов оцените индекс по customer_id, возможно частичный с предикатом amount>0; решение подтверждается планом.