Не могу разобраться с датой

Задание "Определить группы товаров, которые не приобретались в 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 строку исключает - следовательно все строки будут пропущены и результат окажется пустым.


Могу ошибаться на счёт структуры таблиц, т.к. не вижу их, но вот то что отсутствует связь между подзапросом и запросом - это причина ошибки.

→ Ссылка