Sql 与'的内部连接;和';条件(如果存在)否则(如果不存在)
我有表'Images',如果存在,我想获取主图像,如果不存在,则获取表中的第一行。我用这个:Sql 与'的内部连接;和';条件(如果存在)否则(如果不存在),sql,sql-server-2008,tsql,select,Sql,Sql Server 2008,Tsql,Select,我有表'Images',如果存在,我想获取主图像,如果不存在,则获取表中的第一行。我用这个: SELECT Students.Id, Images.ImagePath FROM Students INNER JOIN Images ON Students.Id = Images.StudentId AND ( (Images.IsMain = 1) OR (Images.ImagePath = (
SELECT Students.Id, Images.ImagePath
FROM Students INNER JOIN
Images
ON Students.Id = Images.StudentId
AND ( (Images.IsMain = 1)
OR (Images.ImagePath = (
SELECT TOP(1) ImagePath
FROM Images
WHERE StudentId = Students.IdId)))
WHERE Students.Id = @StudentId
如果图像中没有“IsMain”,我只能得到一行,但是如果有“IsMain”,我会得到两行
您的问题是您选择的是IsMain图像和第一个图像 下面的代码选择第一行,如果它存在的话,它将是IsMain行,否则将是顶行
SELECT Students.Id, Images.ImagePath
FROM Students INNER JOIN
Images
ON Students.Id = Images.StudentId
AND Images.ImagePath = (
SELECT TOP(1) ImagePath
FROM Images
WHERE StudentId = Students.Id
ORDER BY IsMain DESC) -- This line forces the IsMain image to be the top image returned.
WHERE Students.Id = 1
SELECT a.*,
c.ImagePath
FROM Students a
LEFT JOIN
(
SELECT StudentID, ImagePath,
ROW_NUMBER() OVER (PARTITION BY StudentID
ORDER BY IsMain DESC) rn
FROM Images
) c ON c.rn = 1 AND
a.ID = c.StudentID
-- WHERE a.ID = 1 -- remove this if you want for specific Student
图像上至少有一条记录,则将左连接更改为内部连接,如何
SELECT
S.Id,
COALESCE(MI.ImagePath, OI.ImagePath) ImagePath
FROM
Students S
LEFT JOIN
Images MI
ON S.Id = MI.StudentId AND MI.IsMain = 1
INNER JOIN
Images OI
(
SELECT TOP 1 ImagePath
FROM Images
WHERE StudentId = Students.IdId
)
WHERE
Students.Id = @StudentId
您应该在子查询中指定order by,以便知道将选择哪个其他图像。为什么所有这些查询都如此复杂,我是否遗漏了什么?这就像第一排一样简单
SELECT top (1) Students.Id, Images.ImagePath
FROM Students INNER JOIN
Images
ON Students.Id = Images.StudentId
WHERE Students.Id = 1
order by case when Images.IsMain = 1 then 1 else 0 end desc
--order by Images.IsMain = 1
“如果图像中没有'IsMain',我只会得到一行,但如果有'IsMain',我会得到两行。”我想得到“main”,如果不存在,第一行,而不是两行。查询返回无效结果。它应该是image2
是,这将起作用:D
,但仅适用于特定ID。如果您删除WHERE Students.Id=1
并且OP希望获取所有记录,则此查询将失败,因为他的查询中的TOP(1)
是Students.Id=@StudentId,因此我假设他想要单个用户的图像,而不是所有用户的图像。简单而聪明。@mosh没问题:)我只是希望我知道为什么它被否决了!
SELECT top (1) Students.Id, Images.ImagePath
FROM Students INNER JOIN
Images
ON Students.Id = Images.StudentId
WHERE Students.Id = 1
order by case when Images.IsMain = 1 then 1 else 0 end desc
--order by Images.IsMain = 1