Не могу разобраться с датой
Задание "Определить группы товаров, которые не приобретались в 2005 году"
Правильное решение:
SELECT good_type_name
FROM GoodTypes AS NotG
WHERE NOT EXISTS
(SELECT DISTINCT good_type_name
FROM Payments, Goods, GoodTypes
WHERE good_id=good
AND good_type_id=type
AND YEAR(date)=2005
AND good_type_name=NotG.good_type_name)
Мое решение:
SELECT good_type_name
FROM GoodTypes
JOIN Goods ON GoodTypes.good_type_id=Goods.type
JOIN Payments ON Goods.good_id=Payments.good
WHERE NOT EXISTS (
SELECT good_type_name
FROM GoodTypes
WHERE YEAR(date)=2005)
Что в моей логике не так? что выдает неправильный ответ?
Ответы (1 шт):
Автор решения: Виталий Злобин
→ Ссылка
В вашем решении не хватает связи с внешним запросом:
SELECT good_type_name
FROM GoodTypes AS GT
JOIN Goods ON NotG.good_type_id = Goods.type
JOIN Payments ON Goods.good_id = Payments.good
WHERE NOT EXISTS (
SELECT 1
FROM GoodTypes
WHERE YEAR(date) = 2005
AND good_type_name = GT.good_type_name)
Вот этой:
AND good_type_name = NotG.good_type_name
Соответственно подзапрос выдаёт результат для всех строк. А если результат есть(неважно какой), то NOT EXISTS строку исключает - следовательно все строки будут пропущены и результат окажется пустым.
Могу ошибаться на счёт структуры таблиц, т.к. не вижу их, но вот то что отсутствует связь между подзапросом и запросом - это причина ошибки.