0

다음 표 (**는 개인 키를 나타냄)의 팀에서 두 개 이상의 게임을 한 플레이어를 찾고 있는데 찾기가 어렵습니다. 내가 (아래)를 생각해 낼 수있는 최고의 쿼리가 가장 효율적이라고 생각합니다. 그것을 개선하는 방법에 대한 아이디어, 그리고 많이 주시면 감사하겠습니다 이유에 대한 설명은 단일 게임보다 더 재생 가지고있는 플레이어 요구하고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 
+0

샘플 데이터와 예상 출력을 더 잘 이해할 수 있습니까? 또한, 나는 테이블 디자인이 약간 잘못되었다고 생각한다. 'Player'는'gid'와'name'을 가지고 있습니다. '게임'에서'gid'는 두 팀을 가질 수 있습니다. 그래서'player.gid'는 일정 할 것이고 팀은'game.tid'에서 다를 수 있습니다. 플레이어 이름이 동일하면 더 많은 문제가 발생합니다. – Orangecrush

+0

플레이어 내부에는 PID 필드도 있으며 MEMBEROF 테이블이 있습니다. 쿼리에 불필요한 부분이 있기 때문에 나는 그것을 버렸다. 스펙에는 두 명의 플레이어가 같은 이름을 갖지 않을 것이라고 나와 있습니다. 돌아 보면 나는 혼란의 잠재력을 볼 수있다! 아이디어는 그들이 플레이 한 팀과 함께 2 경기에 출전 한 모든 선수들을 나열하는 것입니다 (그래서 이것은 모든 이적 등을 포함합니다, 그들은 두 팀을 경기에 출전 시켰을 것입니다. 그러나 같은 팀과 반드시 ​​같을 필요는 없습니다 – Hector

답변

2

을 (SQL을 배우려고 노력).

SELECT P.Player_Name 
FROM Player P 
GROUP BY P.Player_Name 
HAVING COUNT(DISTINCT P.GID) > 1 

2 개 이상의 게임 (GID)에서 플레이 한 모든 플레이어를 반환합니다.

당신은 또한 그룹 팀에 의해, 다음이 작업을 수행하려는 경우 : 플레이어 테이블의 GID를 가지고 이상한 것 같다

SELECT P.Player_Name, T.Team_Name 
FROM Player P 
    JOIN Game G ON P.GID = G.GID 
    JOIN Team T ON G.TID = T.TID 
GROUP BY P.Player_Name, T.Team_Name 
HAVING COUNT(DISTINCT G.GID) > 1 

. 아마 PlayerGames 테이블을 가지고 있으면 PlayerId와 GameId를 저장하는 것이 더 합리적입니다. 데이터베이스 정규화에 더 좋습니다. 플레이어 테이블은 각 플레이어에 대해 단일 레코드 만 저장해야합니다.

또한 플레이어와 팀 간의 실제 연관성은 무엇입니까? 이 시나리오에서는 플레이어가 게임을해야하며 게임에 팀이 있어야한다고 말합니다 (또는 게임에 2 개 이상의 팀이 있어야 함). 우리가하는 일에 대해 알려주십시오. 최선의 선택을 제시 할 수 있습니다.

행운을 빈다.

+0

고맙습니다. Orangecrush에 대한 응답으로 원래 게시물에 대한 의견 좀 더 잘 설명해야한다고 생각합니다 .GROUP BY 쿼리는 정확히 내가 한 것과 똑같습니다 (예 : 내 것과 동일).하지만 불행히도 원래 쿼리보다 효율성이 떨어집니다. 이것은 진짜 문제입니다. 원본이 가장 효율적이지만 더 나은 것을 생각할 수 없다고 생각합니다. – Hector

+0

내가 당신을 팔로우하는지 확신하지 못합니다.이 쿼리가 가장 효율적입니다 ... 원래 쿼리는 엉망입니다. :) 당신은 여러 개의 GROUP BY, 다중 테이블 스캔 등을 가지고 있습니다 ... SQL Fiddle을 예제 (sqlfiddle.com)로 빌드하는 것이 가장 좋습니다. 최악의 경우, 내 첫 번째 쿼리를 사용하고 (그것보다 더 효율적으로 처리 할 수는 없습니다) PlayerId IN()을 사용하십시오. 행운을 빕니다. – sgeddes

+0

아쿠아 데이터 스튜디오를 통해 Oracle 데이터베이스에서 쿼리를 실행하고 있습니다. 실행 계획은 내가 게시 한 쿼리에 대해 노드 비용을 10으로 제안합니다. 오리지널은 또한 더 적은 메모리를 사용했습니다. 이것이 제가 처음 게시 한 이유입니다. 제가 사용하는 조인 방법에 대해 (그리고 이전에 시도한) 조인 방법이 더 효율적이어야한다는 데 동의합니다. 그러나 DBMS에서 처리하는 방식이 나타납니다. – Hector

관련 문제