2017-04-24 3 views
-1
Game(p1, p2, pointsp1, pointsp2,), 
Participant(name, club, age) 

FK Game(p1) references Participant(name), 
FK Game(p2) references participant(name) 

이 내 관계형 스키마 내가이 게임에 참가했지만 우승하지 않은 참가자의 이름의 목록을 반환하려고 ...NOT IN을 SQL에서 사용하는 방법?

그래서,

  1. 모두 모여있다 하지
  2. 제거 모든 무승부 이름
존재를 통해 이름,
  • 는 모든 이름에서 누가 이겼 제거

    하지만 게임에 참여하지 않은 사람들을 제거 할 수는 없지만 참가자 명단 열에는 여전히 이름이 있습니다.

    내 코드의이 부분이 내 전체 코드입니다

    { 
    SELECT name 
    FROM Participant 
    JOIN Game 
    WHERE Participant.name!=Game.p1 
        OR Participant.name!=Game.p2 
    } 
    

    을 작동하지 않습니다 :

    SELECT name 
    FROM Participant P 
    WHERE name NOT IN (
        SELECT DISTINCT p1 
        FROM Game G 
        WHERE pointsp1 > pointsp2 
        UNION ALL 
        SELECT DISTINCT p2 
        FROM Game G 
        WHERE pointsp1 < pointsp2 
        UNION ALL 
        SELECT ender 
        FROM Game G 
        WHERE pointsp1 = pointsp2 
        UNION ALL 
        SELECT starter 
        FROM Game G 
        WHERE pointsp1 = pointsp2 
        UNION 
        SELECT name 
        FROM Participant 
        JOIN Game 
        WHERE Participant.name!=Game.p1 
         OR Participant.name!=Game.p2 
    ) 
    
  • +0

    의 사용 가능한 복제 [안에서의 SQL 문?] (http://stackoverflow.com/questions/10132371/not-in-in-sql-statement) –

    답변

    0

    그냥 게임을 해본 적이 참가자의 목록을 원하는 가정,하지만 우승하지 , 이 시도.

    select name 
    from participant 
    where name not in (
        select case 
         when g.pointsp1 < g.pointsp2 then p2 
         when g.pointsp1 > g.pointsp2 then p1 
         end as winner 
        from game g 
        where g.pointsp1 != g.pointsp2 
    ) 
        and name in (
        select p1 from game 
        union all 
        select p2 from game 
    ) 
    

    첫 번째 하위 선택

    두 번째는 모든 참가자 모든 게임을 통해 얻는 모든 수상자를 얻는다 (와 관계를 무시). 이것은 작업을 수행하는 좋은 방법은 아니지만 작동 할 것입니다.

    +0

    덕분에 MJ는 일했다! –

    0

    다음과 같이 할 수 있습니다.

    SELECT name 
    FROM Participant P 
    WHERE name NOT IN (
        SELECT DISTINCT p1 
        FROM Game G 
        WHERE pointsp1 > pointsp2 
        UNION ALL 
        SELECT DISTINCT p2 
        FROM Game G 
        WHERE pointsp1 < pointsp2 
        UNION ALL 
        SELECT ender 
        FROM Game G 
        WHERE pointsp1 = pointsp2 
        UNION ALL 
        SELECT starter 
        FROM Game G 
        WHERE pointsp1 = pointsp2) 
    OR name not in (
        select p1 from game 
        union all 
        select p2 from game 
    )