我是 SQL 新手,正在阅读联接,但我有点困惑,所以需要帮助....
我有一个名为 student_sport 的表,它存储 StudentID 和 SportID
我有另一个存储比赛细节的表......所以基本上是sportsID,MatchId,......
我想做的是....对于一个特定的学生显示已经进行了比赛的运动。IE。如果仅在第二个表中存在运动 ID,则在我检查学生参加的运动时显示该运动 ID。
结果集应该只包含学生参加过比赛的那些运动......
谢谢
好的,因为这是家庭作业(感谢您对此诚实),所以我不会提供解决方案。
设计查询的一般方法是:
你显然需要加入你的两个表。连接的语法是:
FROM table1
JOIN table2 ON boolean_condition
在这里,您的 boolean_condition 是sportid
两个表中的列之间的相等性。
WHERE
您还需要使用该子句过滤您的联接将产生的记录,以便仅保留与您的特定学生匹配的记录。
之后,选择你需要的(你想要所有的运动 id)。
这有足够的帮助吗?
然后你有两个表:
// 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 为它
因为您只需要从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;