如何从SQL查询中消除结果并仅获取某些未重复的信息?

时间:2019-05-16 19:13:30

标签: sql sql-server

这是交易:

Tables relationship

我有这些表,这些表都是用于制作类似Steam的应用程序(下载游戏,与朋友聊天等)。当我想知道哪个朋友玩我的每一个游戏时(我说我玩《我的世界》,我也想看看我的哪些朋友也玩我的世界),而我正在努力形成一个查询我那个。我以为可以在EXCEPT键盘的帮助下完成此操作,但我尝试无济于事。

也许这将有助于了解我最终想要得到的东西:

Query results

如您所见,我与 Migue 有共同的 Crashex Legends ,还有 Crashex Legends Overwatch Test 。在每个普通游戏中,我只希望每个朋友看到一个结果,所以我只会看到结果1、8和9。

3 个答案:

答案 0 :(得分:1)

好吧,尝试使用CTE帮助概念化并将其分解成小块。我将首先为您的主键创建标识列。如果您不使用ID进行引用,则使用关系数据库没有任何好处。但是也许是这样的。 您不必使用CTE,但我认为这有助于逐步进行。您真正要寻找的技巧是MyFriendsThatPlayMyGames_CTE。在这里,您进行左联接,然后获取不为null的所有内容,这意味着存在匹配项。更改为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

答案 1 :(得分:0)

您需要两次加入UserGames,而不是使用OR进行一次。

使用User1和别名UserGames作为UG1加入一次; 然后使用User2和别名UserGames作为UG2再次加入。

然后在您的WHERE子句中,找到UG1.Game = UG2.Game

所在的行

答案 2 :(得分:0)

类似以下代码的代码应该可以为您提供所需的数据。 最佳做法是,不要使用“选择*”;而是明确声明需要返回的列。话虽这么说,但我并不认为您是最佳实践,因为查看数据库设计就等于在黑板上钉钉子。代理键,第三范式,外键约束等。

SELECT 
   US.nickname, UG.game, MG.[user], MG.game
FROM UserFriends AS UF
JOIN Users AS US ON (UF.user1 = US.nickname OR UF.user2 = US.nickname) AND US.nickname <> 'Penny'
JOIN UserGames AS UG ON US.nickname = UG.[user]
JOIN UserGames AS MG ON UG.game = MG.game
WHERE 'Penny' IN (UF.user1, UF.user2)
AND MG.[user] = 'Penny'