0

チーム、学校、課題のデータベースがあります。課題を選択した後、学校(とにかくそのユーザー)はチームを課題に追加して、彼らが課題に取り組み始めることができるようにすることができます。ER図は次のようになります。 ER-データベースの図 重要:データベースのセットアップで別のことが示唆されている場合でも、チーム<->の割り当て関係は1:Nです。チームは1つの割り当てにのみ取り組むことができます。これは、ORMシステムを介して制御されます。

ここに問題があります。データベースには、学校に属していない課題に取り組むチームがあります。学校は課題を選択し、チームを作成して、課題の選択肢を削除しました。これが当てはまる学校(id、name)を見つける必要があります。

私が思いついたこれまでの最良のクエリは次のとおりです。

SELECT schools.school_id, schools.name
FROM schools
LEFT JOIN teams ON schools.school_id = teams.school_id
LEFT JOIN assignment_teams ON teams.team_id = assignment_teams.team_id
LEFT JOIN assignment_schools ON schools.school_id = assignment_schools.school_id
WHERE assignment_teams.assignment_id != assignment_schools.assignment_id;

しかし、手動で結果を確認したところ、機能しません。私が探している正しいクエリは何ですか?

4

1 に答える 1

1

これらの1つは機能するはずですが、どちらが最速かわかりません。

  1.   SELECT school_id
      FROM teams
      INNER JOIN assignment_teams ON teams.team_id = assignment_teams.team_id
      LEFT JOIN assignment_schools ON assignment_schools.school_id = teams.school_id AND  assignment_schools.assignment_id = assignment_teams.assignment_id
      WHERE assignment_schools.school_id IS NULL
    
  2. SELECT school_id
      FROM teams
      INNER JOIN assignment_teams ON teams.team_id = assignment_teams.team_id
      WHERE assignment_id NOT IN (
        SELECT assignment_id
          FROM assignment_schools
          WHERE assignment_schools.school_id = teams.school_id
      )
    
  3. SELECT school_id
      FROM teams
      INNER JOIN assignment_teams ON teams.team_id = assignment_teams.team_id
      WHERE NOT EXISTS (
        SELECT *
          FROM assignment_schools
          WHERE assignment_schools.school_id = teams.school_id
          AND assignment_schools.assignment_id = assignment_teams.assignment_id
      )
    
于 2012-10-14T22:02:02.843 に答える