Мне нужна помощь в решении SQL-запроса, мне нужно перечислить имена потребителей, запрашивающих хотя бы один продукт, но не запрашивающих молоко

#sql #sql-server #sqliteopenhelper

#sql #sql-server #sqliteopenhelper

Вопрос:

Мне нужна помощь в решении запроса «Перечислите имена клиентов, которые запрашивают хотя бы один продукт, но не запрашивают молоко. У меня есть примерное начало, но я понятия не имею, как его закончить. Вот что у меня есть на данный момент.

 SELECT DISTINCT 
    Tb_Consumer.Con_ID, Tb_Consumer.Name
FROM 
    Tb_Consumer, Tb_Requests
WHERE 
    Tb_Consumer.Con_ID = Tb_Requests.Con_ID  
    AND Tb_Consumer.Con_ID NOT IN (SELECT Tb_Consumer.Con_ID)
  

Результат, который я ищу, таков.

 Con_id    Name
----------------
  2       Hammer
  4       Hoffer
  

Комментарии:

1. Tb_Requests tables название столбца, пожалуйста

2. Почему вы отметили как SQLServer, так и sqlite?

3. Формулировка проблемы неоднозначна. Означает ли «но не запрашивает молоко» один продукт, отличный от молока, или что любой запрос на молоко полностью исключает потребителя из запроса?

4. Также: TableA, TableB объединения, как и Tb_Consumer, Tb_Requests , устарели более 25 лет назад. Не используйте их! Выпишите INNER JOIN или LEFT JOIN и поместите условия объединения в ON предложение.

5. Используйте правильное JOIN . Это существует уже более 25 лет.

Ответ №1:

Вместо того, чтобы использовать EXISTS , вы могли бы использовать HAVING . Это сэкономит на 2 сканированиях / поисках таблицы tb_Requests .

 SELECT C.Con_ID, C.[Name]
FROM Tb_Consumer C
     JOIN Tb_Requests R ON C.Con_ID = R.Con_ID
GROUP BY C.Con_ID, C.[Name]
HAVING COUNT(R.Req_ID) > 0
   AND COUNT(CASE R.Product_name WHEN 'Milk' THEN 1 END) = 0;
  

Ответ №2:

использование не существует я предполагаю, что у вас есть product_name столбец в таблице Tb_Requests

     select distinct c.* from Tb_Consumer c join Tb_Requests t1 on c.Con_ID=t1.Con_ID
    where not exists( select 1 from Tb_Requests t where c.Con_ID=t.Con_ID
                      and product_name='milk')
  

Комментарии:

1. Здесь нет необходимости в JOIN to Tb_Requests ., поскольку вы не возвращаете никаких данных в SELECT . EXISTS Достаточно.

2. но есть условие, по крайней мере, один выполненный вами запрос продукта, который подтвердит объединение в таблицу запросов

3. Да, вы правы. Если у них несколько запросов, вы получите дубликаты.

4. Это заставило меня понять, что мое, вероятно, неверно. 🙂 (Теперь тоже исправлено)

5. Мы не знаем названия ваших столбцов @GameGandhi555, мы не можем видеть ваши данные, так что Зая догадалась. Используйте столбец с названием вашего продукта в таблице Tb_Requests . В противном случае замените буквальную строку 'Milk' идентификатором продукта 'Milk' . Я не хочу обидеть, но вы должны попытаться решить простые задачи, подобные этой, самостоятельно, иначе вы никогда не научитесь.