1

SQL Server 2005/2008 を使用して、BB_MEDIAOBJECT (Id, ...)の他のいくつかのデータ フィールドを含むmediaobjectsテーブルBB_COLLECTION (Id, Name, Description)、約 30 のコレクションが定義されているテーブル、およびBB_MEDIAOBJECT_COLLECTION (MediaObjectId, CollectionId)各コレクション内のすべてのアイテムを一覧表示するテーブルがあります。

mediaobjectsコレクションごとに最初の 10 個を返す SQL クエリを定義する方法を教えてください。

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

1 つのアプローチは、CTE (Common Table Expression) を使用することです。いくつかの基準でデータを分割することができます-つまりId、コレクション用です-SQL Serverに、それらのパーティションごとに1から始まるすべての行に番号を付けさせ、他のいくつかの基準で並べ替えます-つまり、おそらくIdメディアオブジェクト用です(指定しませんでした)正確に-最初の10個のオブジェクトが必要です-しかし、これらが何によって順序付けられるかは言いませんでした;最初の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)最初の 10 個のエントリを選択していますId

それはあなたが探しているものに近づきますか??

于 2012-07-01T20:58:23.003 に答える