0

ImagesTagsの間の多対多の関係を表す単純なテーブル構造があります。FooID列はs (GUID) です名前パスはs.uniqueidentifiernvarchar

テーブル スキーマ

タグのセットがあり、それぞれの横に表示する単一の画像を選択する必要があります。画像は、パスで並べ替えられた最初の画像、つまりMIN(Path).

これまでのところ、TagID ごとに 1 つの SELECT ステートメントを実行することでこれを行うことができました。

SELECT TOP 1 Images.ImageID
FROM Images 
     inner join ImageTags on Images.ImageID = ImageTags.ImageID 
     inner join Tags on ImageTags.TagID = Tags.TagID 
WHERE Tags.TagID = @p0 
ORDER BY Images.Path

ただし、これには疑問が残ります。より良い方法はありますか? TagID のセット全体を渡して、このデータを一度に取得できますか? そのタグが適用された画像が少なくとも 1 つある限り、結果セットには提供された TagID ごとに 1 つの行が含まれている必要があります。

SELECT ImageID, TagID
/* ... ??? ... */
WHERE TagID IN (@p0, @p1, @p3, ...)
4

1 に答える 1

1

これは次のことを行う必要があります。

;WITH CTE AS
(
    SELECT  IT.ImageID,
            IT.TagID,
            RN = ROW_NUMBER() OVER( PARTITION BY IT.TagID
                                    ORDER BY I.Path)
    FROM ImageTags IT
    INNER JOIN Images I
        ON IT.ImageID = I.ImageID
)
SELECT  T.TagID,
        C.ImageID
FROM Tags T
INNER JOIN CTE C
    ON T.TagID = C.TagID
WHERE C.RN = 1
AND TagID IN (@p0, @p1, @p3, ...)
于 2013-10-02T18:19:32.703 に答える