список тех идентификаторов клиентов из таблицы X, которые купили все продукты из таблицы Y?

0

У меня есть 2 таблицы X & Y,

Таблица X (имеет 5 записей)

Cust_Id  Prod_Key 
 1        'A'
 1        'D'
 2        'C'
 3        'D'
 2        'B'

Таблица Y (имеет 2 записи)

Prod_Key 
  'A'
  'D'

Нужен SQL, чтобы перечислить Cust_ID, который имеет все продукты из таблицы Y. ~ Невозможно выполнить жесткий код, так как таблица обновляется

  • 0
    Вы пытались использовать объединения, чтобы получить записи?
  • 0
    Является ли комбинация Cust_id и Prod_key уникальной в таблице X?
Теги:
mysql-workbench

5 ответов

3
Лучший ответ

Вы можете попробовать следующее:

select 
  cust_id 
from 
  Y
LEFT OUTER JOIN 
  X 
  on Y.Prod_key = X.Prod_key
Group by 
  Cust_id
having 
 count(DISTINCT X.Prod_key) = (select count(*) from Y);

SQL FIDDLE DEMO

  • 0
    Спасибо, Иманкур, просто пытаюсь понять, как «Наличие» может иметь значение. Если Count (Distinct X.Prod_Key) = 2 работает, любое объяснение мне поможет.
1

Вы можете сделать то же самое, используя INNER JOIN с GROUP BY и COUNT как COUNT ниже.

SELECT x.Cust_Id
FROM X x
INNER JOIN Y y ON y.Prod_Key = x.Prod_Key
GROUP BY x.Cust_Id
HAVING COUNT(y.Prod_Key) = (SELECT COUNT(*) FROM Y)
  • 0
    Благодаря Сюзангу, это сработало. Кажется, это намного проще, чем другие рекомендации. Я все еще пытаюсь понять, как работает это Бытие. Наличие Count (y.Prod_Key) должно возвращать значения = 2 Выберите Count (*) Из Y также равно 2 Если мы независимо запросим SELECT x.Cust_Id ОТ X x INNER JOIN Y y ON y.Prod_Key = x.Prod_Key GROUP BY x.Cust_Id это привело бы к Cust_Id 1 3 Как это, наконец, дает 1 после того, как Включение Имея для меня загадку :(
  • 0
    Именно HAVING фильтрует записи. Просто добавьте столбцы count в запросе как COUNT(y.Prod_Key) countExist после чего вы получите countExist 2 для x.Cust_Id=1 и 1 для x.Cust_Id=3 поэтому после добавления предложения HAVING будет возвращен идентификатор с равным числом Prod_Key(s) как у нас в таблице Y Я уверен, вы поймете это, пожалуйста, попробуйте один раз.
0

попробуй это:

выберите * from x, где prod_key в (выберите prod_key из Y)

  • 0
    Результат таков. Cust_Id Prod_Key 1 A 1 D 3 D
0

Вы также можете попробовать внутреннее соединение, так как вам нужен только customerid чей productkey присутствует в таблице y

SELECT x.Cust_Id 
FROM x 
INNER JOIN y
ON x.Prod_Key = y.Prod_key 
  • 0
    Это не работает, если вы видите ответ «1», так как только идентификатор клиента: 1 - единственный человек, купивший продукты A, D в таблице X из таблицы Y.
0

Вы можете попробовать следующий код, чтобы получить уникальный список Cust_IDs

select DISTINCT Cust_Id from X where x.Prod_key in (select y.Prod_key from Y)

  • 0
    Хотя этот фрагмент кода может быть решением, включение пояснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
  • 0
    Это не сработало.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню