【发布时间】:2019-11-18 22:57:23
【问题描述】:
基本上我想做的是,选择用户最后的 3 个操作。但是 RelationId 上没有重复项,并且还有 innerjoin 权限,只是为了确保用户仍然有权执行相同的操作。
我唯一想要的权限是 RelationId。
没有重复我的意思是如果有两行具有相同 RelationId 的 Action 应该选择靠近顶部的那一行(按 TimeStamp 排序)。
到目前为止我想出了什么:
SELECT DISTINCT a.*, p.RelationId
FROM [Action] [a]
INNER JOIN [Permission] p
ON ([p].[RelationId] = [a].[RelationId]
AND [p].[RelationType] = [a].[RelationType]
AND [p].[UserId] = [a].[UserId]
AND [p].[Deleted] = 0)
WHERE [a].[ActionType] = 'Clicked'
AND [a].[RelationType] = 'Direct'
AND [a].[UserId] = 5
AND [a].[Deleted] = 0
ORDER BY [a].[TimeStamp] DESC
OFFSET 0 ROWS
FETCH NEXT 3 ROWS ONLY
分页只需要使用OFFSET X ROWS和FETCH NEXT 3 ROWS
由于某种原因,这不起作用,因为我在 RelationId 上得到了重复项。 没有错误。
示例数据:
action (
id INTEGER PRIMARY KEY,
ActionType VARCHAR(50) not null,
RelationId INTEGER ForeignKey,
Deleted Bit not null,
TimeStamp DATE not null,
UserId INTEGER ForeignKey
);
期望的结果:一个用户执行的最后 3 次操作,该用户具有不同的 RelationId 权限。
【问题讨论】:
-
样本数据作为文本表和期望的结果会有所帮助。还应添加适当的数据库标签。
-
文本表是什么意思?
-
样本数据最好使用DDL + DML。请edit您的问题包括它,您当前的尝试和您想要的结果。更多详情,read this.
-
定义一个副本。你有 DISTINCT 并且应该没有重复,只要重复意味着所有列值都相同。
-
第一句中定义,在RelationId上定义,在RelationID上没有重复
标签: sql sql-server inner-join distinct