다음 표 (**는 개인 키를 나타냄)의 팀에서 두 개 이상의 게임을 한 플레이어를 찾고 있는데 찾기가 어렵습니다. 내가 (아래)를 생각해 낼 수있는 최고의 쿼리가 가장 효율적이라고 생각합니다. 그것을 개선하는 방법에 대한 아이디어, 그리고 많이 주시면 감사하겠습니다 이유에 대한 설명은 단일 게임보다 더 재생 가지고있는 플레이어 요구하고SQL, HAVING이 합류보다 더 효율적일 수 있다고 생각 함
Team (*tid*, name)
Game (*gid*, tid)
Player (*gid*, *name*)
SELECT Team_Name, Player_Name
FROM (SELECT GID, TID FROM GAME) G
,(SELECT NAME AS Player_Name, GID FROM PLAYER) P
,(SELECT NAME AS Team_Name, TID FROM TEAM) T
WHERE ( G.GID = P.GID
AND Player_Name IN (SELECT P.NAME
FROM GAME G
,PLAYER P
WHERE G.GID = P.GID
GROUP BY P.NAME
HAVING COUNT(P.NAME) > 1)
AND T.TID = G.TID
)
GROUP BY Team_Name, Player_Name
HAVING COUNT(Player_Name) > 1
ORDER BY Team_Name
샘플 데이터와 예상 출력을 더 잘 이해할 수 있습니까? 또한, 나는 테이블 디자인이 약간 잘못되었다고 생각한다. 'Player'는'gid'와'name'을 가지고 있습니다. '게임'에서'gid'는 두 팀을 가질 수 있습니다. 그래서'player.gid'는 일정 할 것이고 팀은'game.tid'에서 다를 수 있습니다. 플레이어 이름이 동일하면 더 많은 문제가 발생합니다. – Orangecrush
플레이어 내부에는 PID 필드도 있으며 MEMBEROF 테이블이 있습니다. 쿼리에 불필요한 부분이 있기 때문에 나는 그것을 버렸다. 스펙에는 두 명의 플레이어가 같은 이름을 갖지 않을 것이라고 나와 있습니다. 돌아 보면 나는 혼란의 잠재력을 볼 수있다! 아이디어는 그들이 플레이 한 팀과 함께 2 경기에 출전 한 모든 선수들을 나열하는 것입니다 (그래서 이것은 모든 이적 등을 포함합니다, 그들은 두 팀을 경기에 출전 시켰을 것입니다. 그러나 같은 팀과 반드시 같을 필요는 없습니다 – Hector