我是SQL的新手并正在阅读联接,但我有点困惑,所以需要帮助......
我有一个名为student_sport的表,它存储StudentID和SportID
我有另一张表存储比赛的详细信息...所以基本上是sportsID,MatchId,....
我想做的是......对于一个特定的学生展示已经进行过比赛的运动。即。如果第二个表格中存在sportID,则只有当我检查学生参加哪项运动时才会显示。
结果集应仅包含已经玩过比赛的学生的那些运动....
由于
答案 0 :(得分:3)
好的,因为这是家庭作业(感谢对此诚实),我不会提供解决方案。
设计查询的一般方法是:
你显然需要加入你的两张桌子。连接的语法是:
FROM table1
JOIN table2 ON boolean_condition
这里你的boolean_condition在两个表中的列sportid
之间是相等的。
您还需要使用WHERE
子句过滤您的联接将生成的记录,以便仅保留与您的特定学生匹配的记录。
之后,选择您需要的(您想要所有体育ID)。
这有用吗?
答案 1 :(得分: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 Coments,tx for it
答案 2 :(得分: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;
答案 3 :(得分:-1)