如何选择受非集合数据限制的数据集?

时间:2013-10-02 17:58:55

标签: sql tsql

我有一个简单的表结构,表示图像标记之间的多对多关系。 FooID 列是uniqueidentifier s(GUID)。 名称路径nvarchar s。

Table schema

我有一组标签,需要选择一个图像显示在每个标签旁边。图像应该是按Path排序的第一个图像,即MIN(Path)

到目前为止,我已经能够为每个TagID执行一个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

这让我感到疑惑,但是:有更好的方法吗?我可以通过传入整个 set 的TagID来一次性获取这些数据吗?对于每个提供的TagID,结果集应该有一行,只要至少有一个图像应用了该标记。

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

1 个答案:

答案 0 :(得分: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, ...)