2012-04-27 64 views
4

假设我有一个Person表和一个Courses表。在Person表中,我有PersonName列。在Courses表中,假设我有CourseTitle,PersonNameCourseDifficultyCourseDifficulty是1-4(4是最难的)。我如何返回Person中的人员列表,并且每个人都有一列显示他们正在接受的最困难的课程,列表为CourseTitleSQL为嵌套选择创建别名列?

据我所知,我得到了最困难的类Brett是做走的CourseTitle如下:

SELECT CourseTitle 
FROM Courses 
WHERE PersonName = 'Brett' 
    AND CourseDifficulty = (SELECT MAX(CourseDifficulty) 
          FROM Courses 
          WHERE PersonName='Brett') 

但我怎么运行中的每个人Person表?我想要的结果是像

Brett-SQL For Dummies 4 
Tim-Quantum Mechanics 
Jane-Thermodynamics 2 

对不起noobness。先谢谢您的帮助!

+0

如果学生有1个以上的“最困难课程”,您希望发生什么? (哦,这是作业吗?) – 2012-04-27 18:34:16

+0

不,这是工作。我有一个更复杂的情况,但这是我需要在最基本的层面上做的。在这种情况下,没有一个人会有任何两个课程相同的难度 – DontFretBrett 2012-04-27 18:56:11

回答

5

您可以使用以下

SELECT p.name ,p.address, c.courseTitle ,c.courseDifficulty FROM (
     SELECT personName, courseTitle, MAX(courseDifficulty) AS courseDifficulty 
     FROM course 
     GROUP BY personName 
) AS c RIGHT JOIN person AS p ON p.name = c.personName 

这里我假设PERSONNAME是独一无二的。否则,你可以在这里使用唯一的id而不是人名,并在select语句中添加这个字段。

+0

啊,你可以使用一个选择的AS X然后加入X到另一个表。我认为这是为我做的。我会尝试并回复你 – DontFretBrett 2012-04-27 18:45:51

1

试试这个:

SELECT c.CourseTitle, c.PersonName, c.CourseDifficulty 
    FROM Courses c 
WHERE c.CourseDifficulty=(SELECT MAX(c2.CourseDifficulty) FROM Courses c2 WHERE c2.PersonName=c.PersonName) 
+0

如果布雷特最难的课程是3,而鲍勃最难的课程是4。如果你只返回4的布雷特将被排除。我可能会错误地阅读它 – DontFretBrett 2012-04-27 18:20:31

+0

我继续尝试。在Course表中的1186条记录中,我得到了964个记录,并返回了所有不同的CourseDifficulty的1到4,PersonName列对于每个Person都是不同的。 – DontFretBrett 2012-04-27 18:27:22

+0

这个SQL只应该返回记录中最难记录的那些课程的记录。但是,如果一个人在同一最大难度级别上有不止一门课程,它将返回所有这些课程。我认为这就是为什么你为同一个人获得倍数......在这种情况下应该返回什么? – JoshL 2012-04-27 18:39:40