我正在处理来自我们分销商的内容,他们的数据库文件并不是世界上最好的。所以,我在尽我所能,尽我所能。
我有两张桌子,HLItems和HLImages。
我需要从HLItems退回所有的产品。对于不存在的行,我需要显示一条消息。
这是我试过的,但没有用。它返回所有记录,即使是空行,也会显示“前端掩护”。
封面是记录中显示的内容,如果记录存在的话。不然的话什么都没有。
右外连接
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,和标题..。(为了简单起见,如下所示)
297110 -封面 297110 -空 49043128 -封面 49014741 -空 50563362 -封面 50301310 -空
发布于 2018-05-10 21:44:42
中使用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才能为false。但是如果没有,外部查询就不会有一个非空的结果,所以在这种情况下也不会看到'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'。
发布于 2018-05-10 21:01:47
在不知道预期结果的情况下,一个简陋(可能不完美)的解决方案是使用外部应用。
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)https://stackoverflow.com/questions/50281345
复制相似问题