SQL查询加入2个表

时间:2011-10-03 13:27:41

标签: sql semi-join

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

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

我有另一张表存储比赛的详细信息...所以基本上是sportsID,MatchId,....

我想做的是......对于一个特定的学生展示已经进行过比赛的运动。即。如果第二个表格中存在sportID,则只有当我检查学生参加哪项运动时才会显示。

结果集应仅包含已经玩过比赛的学生的那些运动....

由于

4 个答案:

答案 0 :(得分:3)

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

设计查询的一般方法是:

  • 想一想如何编写FROM块(你的数据源是什么)
  • 想一想如何编写WHERE块(适用的过滤器)
  • 编写SELECT块(您希望从过滤后的数据中获取)。

你显然需要加入你的两张桌子。连接的语法是:

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)

那么查询就是这样的:

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

Thisthis可以让您对sql连接有所了解