在多个表的单个SQL语句中“为每个”行为

时间:2012-06-18 11:55:05

标签: sql sql-server join

我有两张相当大的桌子,我们称它们为“作者”和“文章”。 'articles'表中的每一行都与一个由'AuthorID'字段中的值表示的作者相关联。

我们有一个页面,其中显示一组符合特定条件的编写器,以及与每个编写器关联的第一篇文章,按文章中“DatePublished”字段的值排序。

目前,这是通过执行多个查询来实现的,这些查询结果非常慢,特别是在为大量作者执行时。我不是这个主题的专家,但我很确定有一种方法可以用一个声明获得这个数据,这个声明比当前的混乱更加优化。

以另一种方式表达:(将每个函数调用视为单个SQL查询)

我们现在拥有的:

$authors = get_some_authors($criteria);
for each($author in $authors) {
    $author->lastArticle = get_latest_article_by_author($author_id);
}

我们需要什么:

$authors_with_last_articles = get_some_authors_and_their_latest_articles($criteria);

我们正在使用MS SQL Server 9.0。

希望我能正确解释问题。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

您可以使用outer apply来实施for-each行为:

select  *
from    Authors
outer apply
        (
        select  top 1 *
        from    Articles
        where   Authors.ID = Articles.AuthorId
        order by
                Articles.PublishDate desc
        ) as LastArticle