Первый INNER JOIN действительно возвращает пары клиентов и их заказов. Во втором запросе не хватает группировки и условия HAVING COUNT(*) > 10, чтобы оставить клиентов с более чем десятью заказами.
d. Записи только о тех клиентах и заказах, если у клиентов есть заказы
Первый INNER JOIN действительно возвращает пары клиентов и их заказов. Во втором запросе не хватает группировки и условия HAVING COUNT(*) > 10, чтобы оставить клиентов с более чем десятью заказами.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
d. Записи только о тех клиентах и заказах, если у клиентов есть заказы
select * from Clients inner join Orders on Clients.ClientId = Orders.ClientId
g. Клиенты, у которых заказов больше 10
select * from Clients inner join Orders on Clients.ClientId = Orders.ClientId
Ответ
Первый INNER JOIN действительно возвращает пары клиентов и их заказов. Во втором запросе не хватает группировки и условия HAVING COUNT(*) > 10, чтобы оставить клиентов с более чем десятью заказами.
Если нужны именно клиенты без повторения строки на каждый заказ:
SELECT c.*
FROM Clients AS c
JOIN (
SELECT ClientId
FROM Orders
GROUP BY ClientId
HAVING COUNT(*) > 10
) AS active ON active.ClientId = c.ClientId;
Для первого пункта исходный INNER JOIN корректен, но клиент с несколькими заказами появится несколько раз. Если нужны только клиенты, у которых есть хотя бы один заказ, удобнее WHERE EXISTS. COUNT(*) здесь считает строки Orders; ограничения по статусу или периоду нужно добавить отдельно.