具有多个表和关系的复杂SQL查询

use*_*133 8 sql postgresql

在这个查询中,我必须列出一对玩家ID和玩家名称的球员,他们为同一支球队效力.如果一名球员为3支球队效力,则另一支球员必须参加完全相同的3支球队.不能少,不多了.如果两名球员目前不参加任何球队,他们也应该被包括在内.查询应该返回(playerID1,playername1,playerID2,playerName2)而没有重复,例如如果玩家1信息在玩家2之前出现,则不应该有另一个玩家2信息在玩家1之前出现的元组.

例如,如果玩家A为洋基队和红袜队队员比赛,而队员队员为洋基队队员,红袜队队员和道奇队队员队效力,我就不应该参加比赛.他们都必须为洋基队和红袜队效力,而不是其他人.现在,如果玩家为同一个团队玩游戏,此查询会找到答案.

Tables:
player(playerID: integer, playerName: string)
team(teamID: integer, teamName: string, sport: string)
plays(playerID: integer, teamID: integer)

Example data:
PLAYER    
playerID    playerName
1           Rondo
2           Allen
3           Pierce
4           Garnett
5           Perkins

TEAM      
teamID     teamName       sport
1          Celtics        Basketball
2          Lakers         Basketball
3          Patriots       Football
4          Red Sox        Baseball
5          Bulls          Basketball

PLAYS
playerID    TeamID
1           1
1           2
1           3
2           1
2           3
3           1
3           3
Run Code Online (Sandbox Code Playgroud)

所以我应该把它作为答案 -

 2, Allen, 3, Pierce 
 4, Garnett, 5, Perkins
Run Code Online (Sandbox Code Playgroud)

.

2,艾伦,3皮尔斯是一个snwer,因为他们都只参加CELTICS和PATRIOTS 4,加内特,5,帕金斯的答案是因为两位球员都没有参加任何应该输出的球队.

现在我的查询是

SELECT p1.PLAYERID, 
       f1.PLAYERNAME, 
       p2.PLAYERID, 
       f2.PLAYERNAME 
FROM   PLAYER f1, 
       PLAYER f2, 
       PLAYS p1 
       FULL OUTER JOIN PLAYS p2 
                    ON p1.PLAYERID < p2.PLAYERID 
                       AND p1.TEAMID = p2.TEAMID 
GROUP  BY p1.PLAYERID, 
          f1.PLAYERID, 
          p2.PLAYERID, 
          f2.PLAYERID 
HAVING Count(p1.PLAYERID) = Count(*) 
       AND Count(p2.PLAYERID) = Count(*) 
       AND p1.PLAYERID = f1.PLAYERID 
       AND p2.PLAYERID = f2.PLAYERID; 
Run Code Online (Sandbox Code Playgroud)

我不是百分百肯定,但我认为这会找到为同一支球队效力的球员,但是我想找出那些仅为所有相同球队效力的球员,如上所述

在此之后,我被困在如何接近它.有关如何解决此问题的任何提示.谢谢你的时间.

Gid*_*dil 0

我想到了两种可能的解决方案:

  1. 光标 - 循环遍历每个玩家并将其与所有其他玩家进行比较,直到得出结论。
  2. 递归查询 - 相同的想法,虽然稍微复杂一些,但无疑是更好的方法。或许也有更好的表现。

您能否提供一些示例数据以便我创建示例?