Использование RIGHT OUTER JOIN
в
SELECT TOP 1 HLImages.Caption
FROM HLImages
RIGHT OUTER JOIN HLItems ON HLImages.ItemNo = HLItems.ItemNo
приводит к тому, что все строки из HLItems
(правая таблица) включаются в результат независимо от того, существует ли соответствующая строка из HLImages
. Это означает, что этот запрос в EXISTS
всегда верен. Вот почему вы всегда получаете 'Front Cover'
от этого CASE
.
(EXISTS
может быть ложным, только если в HLItems
не было строк. Но если бы их не было, внешний запрос не имел бы непустого результата, поэтому вы бы не увидели 'No Cover'
тоже в этом случае.)
А это
SELECT TOP 1 Caption
FROM HLImages
WHERE Caption = 'Front Cover'
всегда приводит к непустому набору, если есть изображение с заголовком 'Front Cover'
, независимо от того, к какому продукту оно относится. Я предполагаю, что есть такие изображения, поэтому применимо то же, что и выше.
Попробуйте простой коррелированный подзапрос, используя WHERE
.
SELECT
(CASE
WHEN EXISTS (SELECT *
FROM HLImages
WHERE HLImages.ItemNo = HLItems.ItemNo
AND HLImages.Caption = 'Front Cover')
THEN 'Front Cover'
ELSE 'No Cover'
END) AS thumbnail,
Title, ItemNo, InternetCategoryID
FROM
HLItems
WHERE
(InternetCategoryID = 11)
Вы можете удалить AND HLImages.Caption = 'Front Cover'
, если хотите увидеть, существует ли какое-либо изображение для продукта, независимо от заголовка.