2

我是 SQL 新手,正在阅读联接,但我有点困惑,所以需要帮助....

我有一个名为 student_sport 的表,它存储 StudentID 和 SportID

我有另一个存储比赛细节的表......所以基本上是sportsID,MatchId,......

我想做的是....对于一个特定的学生显示已经进行了比赛的运动。IE。如果仅在第二个表中存在运动 ID,则在我检查学生参加的运动时显示该运动 ID。

结果集应该只包含学生参加过比赛的那些运动......

谢谢

4

4 回答 4

3

好的,因为这是家庭作业(感谢您对此诚实),所以我不会提供解决方案。

设计查询的一般方法是:

  • 想想怎么写FROM块(你的数据源是什么)
  • 想想如何编写 WHERE 块(应用哪些过滤器)
  • 编写 SELECT 块(您想要从过滤的数据中得到什么)。

你显然需要加入你的两个表。连接的语法是:

FROM table1
JOIN table2 ON boolean_condition

在这里,您的 boolean_condition 是sportid两个表中的列之间的相等性。

WHERE您还需要使用该子句过滤您的联接将产生的记录,以便仅保留与您的特定学生匹配的记录。

之后,选择你需要的(你想要所有的运动 id)。

这有足够的帮助吗?

于 2011-10-03T13:35:03.257 回答
2

然后你有两个表:

// One record per student / sport association
student_sport
    StudentID 
    SportID

// A match is only for one sport (warning to your plural) no?
matches
    SportID
    MacthID

你想要:对于一个学生,所有运动都已经在比赛中进行过

SELECT DISTINCT StudentID, student_sport.SportID
FROM student_sport, matches

WHERE 
      -- Select the appropriate player
      student_sport.StudentID = @StudentID    
      -- Search all sport played in a match and plays by the student 
      -- (common values sportid btw student_sport & matches)
  AND student_sport.SportID = matches.SportID 

或者使用这种其他语法(JOIN IN)(它使复杂的查询更容易理解,所以很好学)

SELECT DISTINCT StudentID, student_sport.SportID
FROM student_sport
-- Search all sport played in a match and plays by the student 
-- (common values sportid btw student_sport & matches)
INNER JOIN matches on student_sport.SportID = matches.SportID
WHERE 
      -- Select the appropriate player
      student_sport.StudentID = @StudentID    

ps:包括 Jan Hudec 评论,tx 为它

于 2011-10-03T13:40:01.493 回答
0

因为您只需要从student_sport表中返回结果,所以连接类型是 semijoin。标准 SQL 的半连接运算符很有趣,MATCH例如

SELECT * 
  FROM student_sport 
 WHERE SportID MATCH (
                      SELECT SportID   
                        FROM matches
                       WHERE student_sport.SportID = matches.SportID
                     );

在 SQL 中编写半联接还有许多其他方法,例如这里还有三种:

SELECT * 
  FROM student_sport 
 WHERE SportID IN (
                   SELECT SportID  
                     FROM matches
                    WHERE student_sport.SportID = matches.SportID
                  );

SELECT * 
  FROM student_sport 
 WHERE EXISTS (
               SELECT * 
                 FROM matches
                WHERE student_sport.SportID = matches.SportID
              );

SELECT student_sport.* 
  FROM student_sport 
       INNER JOIN matches
          ON student_sport.SportID = matches.SportID;
于 2011-10-03T13:49:57.220 回答
-1

那么查询将是这样的:

select sm.* 
from student_sport ss join student_matches sm on ss.sportid = sm.sportId
where ss.StudentId = @studendId

应该让您对 sql 连接有一些了解

于 2011-10-03T13:33:24.207 回答