2013-03-04 74 views
0

我有一个SQL Server数据库,我有两个tables,CertificatesCategories。有一对多的关系,每个Certificate可以有很多categories。我试图创建一个将显示数据库中所有证书的查询,但只返回一个记录,每个类别的历史记录最早。我查了一篇几乎完全符合我要求的文章试图创建一个查询,返回所有记录的最早日期

但是它正在搜索的记录数量有限。我已经阅读并发现在其他类型的数据库中执行此操作的不同方法,但在ms sql server中没有这样做的有效方法。

回答

0

没有解决,我知道的大多数数据库查询等一个有效的方法,称为JOIN。与PK-FK关系和索引一起,这对于你所遇到的大部分目标来说都是有效的。尝试学习这些,你会发现我在说什么。

对于这个特定的问题,你只需要JOIN两个表和GROUP在类别字段上,使用MIN集合函数在exp日期字段。如果你可以提供表结构,我们也可以写查询。

+0

我决定回到你的建议的基础知识,它似乎通过在查询设计器中使用正确的groupby和MIN来工作,不需要编码。感谢您回到步骤1 – user2125409 2013-03-04 16:42:09

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 

这个工程于2005年和更大的SQL Server版本。

在旧版本或访问,你需要做一个连接来得到这个:

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