使用SQL Server 2005/2008我有一个表BB_MEDIAOBJECT (Id, ...)
,其中包含mediaobjects
的其他几个数据字段,一个表BB_COLLECTION (Id, Name, Description)
,其中定义了大约30个集合,以及表BB_MEDIAOBJECT_COLLECTION (MediaObjectId, CollectionId)
,列出每个集合中的所有项目。
请帮我定义一个SQL查询,为每个集合提供前10个mediaobjects
。
根据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
答案 0 :(得分:2)
一种方法是使用CTE(公用表表达式)。您可以按照某些条件对数据进行分区 - 即集合的Id
- 并为每个分区的SQL Server编号所有行开始,按其他一些条件排序 - 即Id
对于你的媒体对象(你没有准确指定 - 你想要 10个第一个对象 - 但是你没有说出这些将被订购的内容; 前十个 em>总是暗示必须有某些订单 - 根据您的情况需要更改我的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
在这里,我选择了每个&#34;分区的前十个条目&#34; (即每个Id
) - 由Id
(MediaObjects)以降序排序。
这是否接近你正在寻找的东西?