从连接表中获取一行的更有效方法

时间:2014-09-15 23:25:51

标签: sql-server tsql sql-server-2012

我有以下两个(简化的)表格和列:

表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

2 个答案:

答案 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