Как присоединиться к счету (*) из другого стола - PullRequest
0 голосов
/ 09 июля 2020

У меня есть вопрос, как присоединить счетчик (*) из другой таблицы к базовой таблице.

Вопрос следующий:

Таблица: Клиент

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| customer_id | int     |
| product_key | int     |
+-------------+---------+

product_key - внешний ключ для таблицы Product.

Table: Product

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| product_key | int     |
+-------------+---------+

product_key - столбец первичного ключа для этой таблицы.

Напишите SQL запрос отчета, который предоставляет идентификаторы клиентов из таблицы «Клиенты», которые купили все продукты в таблице «Продукт».

Например:

Таблица клиентов:

+-------------+-------------+
| customer_id | product_key |
+-------------+-------------+
| 1           | 5           |
| 2           | 6           |
| 3           | 5           |
| 3           | 6           |
| 1           | 6           |
+-------------+-------------+

Таблица продуктов:

+-------------+
| product_key |
+-------------+
| 5           |
| 6           |
+-------------+

Таблица результатов:

+-------------+
| customer_id |
+-------------+
| 1           |
| 3           |
+-------------+

Покупатели, купившие все продукты (5 и 6), являются покупателями с идентификаторами 1 и 3.

И мой подход:

select distinct 
c.customer_id 
from customer as c join (
    select 
    count(distinct product_key) as total 
    from product 
) as t 
group by c.customer_id 
having count(distinct c.product_key) = t.total

Но я получаю сообщение об ошибке:

Unknown column 't.total' in 'having clause'

Не могли бы вы выяснить, где я сделал не так? Спасибо за вашу помощь в продвижении.

1 Ответ

1 голос
/ 09 июля 2020

Пункт HAVING не требуется. Вы пытаетесь выполнить декартово соединение в своем SQL. Я сомневаюсь, что агрегирование хорошо работает с декартовым произведением.

Ниже SQL будет возвращен список клиентов, у которых есть все продукты -

select customer_id from (select customer_id, count(distinct p.product_key) product_count
from customer c 
join product p on c.product_key = p.product_key
group by c.customer_id) t
where t.product_count = (select count(distinct product_key) from product);
...