Ну если джойны не доступны только по причине того что таблицы на разных серверах, и вас (Судя по вашему варианту "Костыля" представление пользователя в виде "user_id" - вас устраивает. Думаю такой вариант будет по красивше ... (Но это не точно).
Select
CommentTable.user_id,
CommentTable.comment,
CommentTable.created_ts
From
comments as CommentTable
Inner join
(Select
t.user_id as user_id ,
Max(t.created_ts) as LastTime
From comments as t
Group by t.user_id) as LastTimeTable
On CommentTable.user_id = LastTimeTable.user_id
and CommentTable.created_ts = LastTimeTable.LastTime
Если у вас к таблице "Users" доступен select ... думаю можно попробовать сначала создать на сервере Таблицы comments временную таблицу
Что-то типа
Create table #tt1
(user_id nvarchar(10),
user_name nvarchar(100))
Insert into #tt1
Select user_id , user_name from users
и потом джойнить временную таблицу юзерсов с таблицей которая получилась из запроса выше ... тогда будут доступны ещё и данные таблицы юзерс. (насчет оптимальности не уверен, но думаю сработает)
Итого будет типа :
Create table #tt1
(user_id nvarchar(10),
user_name nvarchar(100))
Insert into #tt1
Select user_id , user_name from users
Select
CommentTable.user_id,
users.user_name,
CommentTable.comment,
CommentTable.created_ts
From
comments as CommentTable
Inner join
(Select
t.user_id as user_id ,
Max(t.created_ts) as LastTime
From comments as t
Group by t.user_id) as LastTimeTable
On CommentTable.user_id = LastTimeTable.user_id
and CommentTable.created_ts = LastTimeTable.LastTime
Left join #tt1 as users
on CommentTable.user_id = users.user_id
drop table #tt1