Хорошо, поэтому мы заботимся только о каждом теге, основываясь на его последней дате создания, поэтому мы можем структурировать внутренний запрос следующим образом:
SELECT tagid,MAX(createddate) as createddate FROM (
SELECT ulpt.tagid,
createddate
FROM userlocationposttag ulpt
WHERE ulpt.UserID=@userid
UNION ALL
SELECT ult.tagid,
createddate
FROM userlocationtag ult
WHERE ult.UserID=@userid
UNION ALL
SELECT upt.tagid,
createddate
FROM userprofiletag upt
WHERE upt.UserID=@userid
) t
GROUP BY tagid
И тогда мы можем обернуть это в другой подпункт и применить десятку:
SELECT TOP 10 tagid FROM (
SELECT tagid,MAX(createddate) as createddate FROM (
SELECT ulpt.tagid,
createddate
FROM userlocationposttag ulpt
WHERE ulpt.UserID=@userid
UNION ALL
SELECT ult.tagid,
createddate
FROM userlocationtag ult
WHERE ult.UserID=@userid
UNION ALL
SELECT upt.tagid,
createddate
FROM userprofiletag upt
WHERE upt.UserID=@userid
) t
GROUP BY tagid
) t ORDER BY createddate desc
И нам больше не нужны отличные (потому что GROUP BY
и MAX
уже гарантировали, что каждый тег появляется только один раз)