0

我有一个简单的表结构,表示ImagesTags之间的多对多关系。FooIDuniqueidentifiers (GUID)。名称路径nvarchars。

表架构

我有一组标签,需要选择一个图像显示在每个标签旁边。图片应该是第一个按 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

不过,这让我想知道:有更好的方法吗?我可以通过传入一整套TagID 来一次性获取这些数据吗?只要至少有一张应用了该标签的图像,结果集就应该为每个提供的 TagID 保留一行。

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 回答