Хорошо, насколько я понимаю, если результаты уже включают спаривание (a, b), они не должны включать (b, a). Это правильно? Если это так, это означает, что основной причиной вашей проблемы является то, что таблица tblDynamicUserList включает пары (a, b) и (b, a). Если мы сначала отфильтруем их в запросе, то объединенные результаты будут такими, как вы ожидали. Обратите внимание, что это также означает, что вам все равно, какое имя пользователя находится в имени u_username, а какое в имени f_username; если это имеет значение, то вам понадобятся оба результата.
Вот скрипт, демонстрирующий ваше текущее поведение. Обратите внимание, что второй запрос в вашем вопросе не дал результатов, которые вы опубликовали. Я обновил его до того, что, как я полагаю, вы используете:
declare @tblUsers table (id int, u_username varchar(20), permission varchar(10), experience int, grade int)
declare @tblDynamicUserList table (u_username varchar(20), f_username varchar(20), f_timestamp datetime default (getdate()))
insert into @tblUsers values (1, 'RanAbraGmail', 'WiFi', 1, 2000)
insert into @tblUsers values (2, 'Ana', 'Phone', 2, 3000)
insert into @tblUsers values (3, 'RoyP', 'Phone', 5, 4000)
insert into @tblUsers values (4, 'anaHeb', 'Phone', 14, 5000)
insert into @tblUsers values (7, 'Sheleg', 'Phone', 15, 5500)
insert into @tblDynamicUserList values ('ana', 'RanAbraGmail', default)
insert into @tblDynamicUserList values ('anaHeb', 'RoyP', default)
insert into @tblDynamicUserList values ('RanAbraGmail', 'Ana', default)
insert into @tblDynamicUserList values ('RanAbraGmail', 'RoyP', default)
insert into @tblDynamicUserList values ('RoyP', 'anaHeb', default)
insert into @tblDynamicUserList values ('Sheleg', 'RanAbraGmail', default)
Select D1.u_username, U1.Permission, U1.Grade, D1.f_username, U2.Permission, U2.Grade
from @tblDynamicUserList As D1
Join @tblUsers As U1
On U1.u_username = D1.u_username
Join @tblUsers As U2
On U2.u_username = D1.f_username
Таким образом, этот запрос будет производить желаемые результаты, сначала получая только отдельные пары имен пользователей, и только затем присоединяясь к таблице пользователей для получения подробностей.
Select D1.username1, U1.Permission, U1.Grade, D1.username2, U2.Permission, U2.Grade
from (select distinct case when u_username < f_username then u_username else f_username end as username1,
case when u_username < f_username then f_username else u_username end as username2
from @tblDynamicUserList) As D1
Join @tblUsers As U1
On U1.u_username = D1.username1
Join @tblUsers As U2
On U2.u_username = D1.username2