我有一个简单的表结构,表示图像和标记之间的多对多关系。 FooID 列是uniqueidentifier
s(GUID)。 名称和路径是nvarchar
s。
我有一组标签,需要选择一个图像显示在每个标签旁边。图像应该是按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, ...)
答案 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, ...)