0

SQL Serverデータベースがありtables、 と の 2 つがCertificatesありCategoriesます。1 対多の関係があり、それぞれが複数Certificateの を持つことができますcategories。データベース内のすべての証明書を表示するクエリを作成しようとしていますが、各カテゴリの最も古い有効期限を持つレコードを 1 つだけ返します。私が探していることをほぼ正確に行う投稿を調べました

しかし、検索するレコードの数には限りがあります。私は他のタイプのデータベースでこれを行うさまざまな方法を読んで見つけましたが、ms sql サーバーでこれを行う効率的な方法はありません。

4

3 に答える 3

2

このために、次のrow_number()関数を使用します。

select c.*
from (select c.*,
             row_number() over (partition by category order by expdate desc) as seqnum
      from certificates c
     ) c
where seqnum = 1

これは、SQL Server バージョン 2005 以降で機能します。

古いバージョンまたは Access では、これを取得するには結合を行う必要があります。

select c.*
from certifications c join
     (select category, max(expdate) as maxexpdate
      from certifications 
      group by category
     ) csum
     on c.category = csum.category and
        c.expddate = csum.maxexpdate
于 2013-03-04T15:25:16.663 に答える
0

私が知っているほとんどのデータベースで、このようなクエリを解決する効率的な方法が 1 つありますJOIN。PK-FK の関係とインデックスを組み合わせると、これまでに遭遇したほとんどの目的に対して十分に効率的です。これらを学んでみてください。そうすれば、私が話していることがわかるでしょう。

この特定の問題については、Exp date フィールドで集計関数を使用してJOIN、2 つのテーブルと GROUPカテゴリ フィールドを単純に指定する必要があります。MINテーブル構造を提供していただければ、クエリも作成できる可能性があります。

于 2013-03-04T15:26:22.950 に答える
0

以下のクエリは、このニーズに適合します。

SELECT *
    FROM dbo.Certificates Cert INNER JOIN
    (SELECT CerificateId,MIN(ExpiryDate)
    FROM dbo.Categories
    GROUP BY CerificateId) AS LatestCategories
    ON Cert.CerificateId = LatestCategories.CerificateId
于 2013-03-04T15:30:07.327 に答える