1

使用 SQL Server 2005 / 2008 我有一个表BB_MEDIAOBJECT (Id, ...),其中包括其他几个数据字段mediaobjectsBB_COLLECTION (Id, Name, Description)其中定义了大约 30 个集合的表,以及一个表BB_MEDIAOBJECT_COLLECTION (MediaObjectId, CollectionId),其中列出了每个集合中的所有项目。

请帮助我定义一个 SQL 查询,mediaobjects为每个集合提供前 10 个查询。

根据 Marc 提供的答案,我得到了以下最终结果,其中查询现在正确显示了 10 个最近修改的项目:

;WITH PartitionedComponents AS  
(  
    SELECT  
        CollectionID = c.ID,  
        c.Name,  
        c.Description, 
        MediaObjectId = m.ID, 
        ROW_NUMBER() OVER(PARTITION BY c.ID ORDER BY m.modifiedby DESC) AS 'RowNum' 
    FROM  
        dbo.BEELDBANK_COLLECTION c 
    INNER JOIN 
        dbo.BEELDBANK_MEDIAOBJECT_COLLECTION mc ON mc.CollectionId = c.ID 
    INNER JOIN 
        dbo.BEELDBANK_MEDIAOBJECT m ON mc.MediaObjectId = m.Id 
) 
SELECT  
    CollectionID,  
    Name,  
    Description, 
    MediaObjectId 
FROM  
    PartitionedComponents 
WHERE 
    RowNum <= 10
4

1 回答 1

2

一种方法是使用 CTE(通用表表达式)。您可以按某些标准对数据进行分区 - 即您Id的集合 - 并让 SQL Server 为每个分区从 1 开始为所有行编号,按其他标准排序 - 即可能Id针对您的媒体对象(您没有指定确切地说-您想要前10 个对象-但您没有说明这些对象的排序方式;前十个始终意味着必须有某种顺序-根据您的情况更改我的 CTE 查询!)

所以尝试这样的事情:

;WITH PartitionedComponents AS
(
   SELECT 
       CollectionID = c.ID, 
       c.Name, 
       c.Description,
       MediaObjectId = m.ID,
       ROW_NUMBER() OVER(PARTITION BY c.ID ORDER BY m.ID DESC) AS 'RowNum'
   FROM 
       dbo.BB_Collection c
   INNER JOIN
       dbo.BB_MEDIAOBJECT_COLLECTION mc ON mc.CollectionId = c.ID
   INNER JOIN
       dbo.BB_MEDIAOBJECT m ON mc.MediaObjectId = m.Id
   WHERE
       ......
)
SELECT 
   CollectionID, 
   Name, 
   Description,
   MediaObjectId
FROM 
   PartitionedComponents
WHERE
   RowNum <= 10

在这里,我为每个“分区”(即每个Id)选择前十个条目 - 按Id(MediaObjects)以降序方式排序。

这是否接近你正在寻找的东西?

于 2012-07-01T20:58:23.003 回答