我有以下两个(简化的)表格和列:
表1:课程 列:CourseID
表2:CourseVersion 列:CourseVersionID,CourseID,Active,UpdateDate,Field1,Field2 ......等
我希望为每个课程行获取单个最新的活动CourseVersion行(如果没有活动的CourseVersion行,则为无行)。请注意,最新的UpdateDate可能不是最新的CourseVersionID。
目前我有这样的查询:
SELECT cv.* FROM Course AS c
CROSS APPLY(SELECT TOP 1 CourseVersion.* FROM CourseVersion
WHERE CourseVersion.CourseID = c.CourseID AND CourseVersion.Active = 1
ORDER BY CourseVersion.UpdateDate DESC) AS cv
这种方法效果很好,但速度很慢。
关于如何提高效率的一般性建议?
NB。使用SQL Server 2012
答案 0 :(得分:2)
with cte as(
select
*,
rn = row_number() over(partition by CourseID order by UpdateDate desc)
from CourseVersion
where
Active = 1
)
select
cv.* --exclude rn
from course c
inner join cte cv
on cv.CourseID = c.CourseID
where
cv.rn = 1
答案 1 :(得分:1)
根据您对每门课程最新版本所需的信息,您可以简单地使用以下内容:
SELECT cvs.CourseID, MAX(cvs.UpdateDate)
FROM CourseVersion AS cvs
WHERE cvs.Active=1
GROUP BY cvs.CourseID