#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
toTb_Requests
., поскольку вы не возвращаете никаких данных вSELECT
.EXISTS
Достаточно.2. но есть условие, по крайней мере, один выполненный вами запрос продукта, который подтвердит объединение в таблицу запросов
3. Да, вы правы. Если у них несколько запросов, вы получите дубликаты.
4. Это заставило меня понять, что мое, вероятно, неверно. 🙂 (Теперь тоже исправлено)
5. Мы не знаем названия ваших столбцов @GameGandhi555, мы не можем видеть ваши данные, так что Зая догадалась. Используйте столбец с названием вашего продукта в таблице
Tb_Requests
. В противном случае замените буквальную строку'Milk'
идентификатором продукта'Milk'
. Я не хочу обидеть, но вы должны попытаться решить простые задачи, подобные этой, самостоятельно, иначе вы никогда не научитесь.