-1

私は2つの非常に大きなテーブルを持っています。それらを「著者」と「記事」と呼びましょう。'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 SQLServer9.0を使用しています。

問題を正しく説明できれば幸いです。よろしくお願いします。

4

1 に答える 1

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
于 2012-06-18T12:04:32.620 に答える