В основном я хочу выбрать 3 последних действия, выполненных пользователем. Но нет дубликатов в RelationId, а также внутренних разрешений, чтобы убедиться, что у пользователя есть разрешение на выполнение того же действия.
Единственное, что я хочу от разрешения - это RelationId.
Не дублируя, я имею в виду, что если есть две строки Action с одинаковым RelationId, следует выбрать одну из них, закрывающуюся наверх (Ordered by 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 ONLY
По какой-то причине это не работает, потому что я получаю дубликаты на 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.