2017-04-24 6 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

    の可能性のある重複した[NOT INでの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 
    ) 
    
    関連する問題