Вернуть все записи и показать сообщение, если запись NULL - PullRequest
0 голосов
/ 10 мая 2018

Я работаю с контентом от нашего дистрибьютора, и его файлы базы данных не самые лучшие в мире.Итак, я делаю все возможное, что у меня есть.

У меня есть две таблицы: HLItems и HLImages.

Мне нужно вернуть ВСЕ продукты с HLItems.А для строк, которые не существуют, мне нужно отобразить сообщение.

  • Если существует = «Передняя обложка»
  • Если не существует = «Нет обложки»

Это то, что я пробовал, но это не такза работой.Он возвращает все записи, даже строки NULL, и отображается «Front Cover».

Передняя обложка - это то, что отображается в записи, если запись существует.Остальное ничего.

С RIGHT OUTER JOIN

SELECT    
    (CASE 
        WHEN EXISTS (SELECT TOP 1 HLImages.Caption 
                     FROM HLImages  
                     RIGHT OUTER JOIN HLItems ON HLImages.ItemNo = HLItems.ItemNo) 
           THEN 'Front Cover'
           ELSE 'No Cover' 
     END) AS thumbnail, 
    Title, ItemNo, InternetCategoryID
FROM  
    HLItems
WHERE 
    (InternetCategoryID = 11)

Выбор только столбца

SELECT  
    (CASE 
        WHEN EXISTS (SELECT TOP 1 Caption
                     FROM HLImages
                     WHERE Caption = 'Front Cover') 
           THEN 'Front Cover'
           ELSE 'No Cover' 
     END) AS thumbnail, 
    Title, ItemNo, InternetCategoryID
FROM
    HLItems
WHERE (InternetCategoryID = 11)

Что-то подобное, это то, что ожидается.(ItemNo и Caption .. показаны ниже для простоты)

297110 - Передняя крышка
297110 - NULL
49043128 - Передняя крышка
49014741 - NULL
50563362 - Передняя частьОбложка
50301310 - NULL

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Использование 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', если хотите увидеть, существует ли какое-либо изображение для продукта, независимо от заголовка.

0 голосов
/ 11 мая 2018

Не зная ожидаемого результата, скромное (возможно, несовершенное) решение будет заключаться в использовании внешнего применения

SELECT   
case when image.Caption is not null then 'Front Cover'
    else 'No Cover'
end
as thumbnail, 
Title, 
ItemNo, 
InternetCategoryID
FROM  HLItems item
outer apply(
    SELECT   top 1 HLImages.Caption AS Caption
    FROM  HLImages 
    where HLImages.ItemNo = item.ItemNo
) image
WHERE (item.InternetCategoryID = 11)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...