Хорошо, попробуйте использовать CTE, чтобы помочь концептуализировать его и разбить на маленькие кусочки. Я бы сначала создал столбцы идентификаторов для ваших первичных ключей. Если вы не ссылаетесь на идентификаторы, использование реляционной базы данных не имеет смысла. Но, может быть, как-то так.
Вы не должны использовать CTE, но я думаю, что это помогает сделать это шаг за шагом. Трюк, который вы действительно ищете, находится в MyFriendsThatPlayMyGames_CTE. Здесь вы делаете левое соединение, а затем захватываете все, что не является нулевым, что означает совпадение. Измените на null, чтобы получать игры, в которых у ваших друзей нет, и т. Д.
with
MyFriends_CTE (me, friend)as(
Select user1, user2
from userFriends
where user1 = @ME
UNION
Select user2, user1
from userFriends
where user2 = @Me
),
MyGames_CTE as (
blah blah
),
MyFriendsGames_CTE as (
select
from myfriends_cte
join games
),
MyFriendsThatPlayMyGames_CTE as(
select
from MyfriendsGames_CTE
left join myGames_CTE
on blah blah
where myGames_CTE.name is not null
)
select
from MyFriendsThatPlayMyGames_CTE