从另一个表中选择最大值

时间:2014-02-24 16:41:37

标签: sql database foxpro

我需要对数据库提供一些帮助,在学校我们必须处理Fox Pro(我知道它已经老了,但我能做些什么),其中一项任务说明如下:“列出每个人的最长课程教师”。

我们的表格是

课程 - > idc(主键),id,名称,长度

教师 - > id(主键),名称

有没有办法用select命令执行此操作?我必须在最后的teacher.name和courses.name中使用2列。我的意思是老师必须是独一无二的,并且在课程旁边最多,但只能从他/她教授的那些...

我试过了:

1)SELECT teachers.name,courses.name,MAX(courses.legth) FROM teachers,courses WHERE teachers.id=courses.id --->错误

2)SELECT teachers.name,courses.name FROM teachers,courses WHERE courses.legth=(SELECT MAX(courses.length) FROM courses) AND courses.id=teachers.id --->仅显示最长的课程

3)制作类似的程序:

BOF()
i=1
CALCULATE MAX(teachers.id) TO y
DO WHILE i<y
    IF teachers.id=i
        x=SELECT MAX(courses.legth) FROM courses,teachers WHERE teachers.id=i
        LIST teachers.name,courses.name FOR courses.legth=x
        SKIP
        i=i+1
     ENDIF
ENDDO

---&GT;那个人永远没有结果。


过了一段时间,我设法做了一些事情,但是形式非常丑陋,我确信必须有更好的方法:

i=1
USE teachers
CALCULATE MAX(id) TO y
USE
DO WHILE i<=y
    USE courses
    CALCULATE MAX(length) FOR id=i TO x
    USE
    USE teachers
    LIST name for id=i
    USE
    USE courses
    LIST name for id=i AND length=x
    USE
    i=i+1
ENDDO

谢谢。

1 个答案:

答案 0 :(得分:0)

是的,其他人一直在给你带来困难,但现在你知道要表明你为解决问题而认真尝试过的事情。虽然没有一个对你有用,但我会尽力帮助解释。

首先,单独从课程表开始,因为它具有我们可以使用的教师的ID。这是一个简单的group by子句。

select ;
      c.id, ;
      max( c.length ) as CourseMaxLen ;
   from ;
      courses c ;
   group by ;
      c.id ;
   into ;
      cursor C_MaxCoursePerTeacher

然后,您可以浏览此结果以查看。现在,每个老师都有一个非常简单的查询。然后,您可以使用此作为加入教师表的基础,以获取教师姓名。然后再由老师和课程长度再次加入原始课程表。但是,如果您的教师具有相同长度的多个课程,则将返回相同长度的每个课程。

select
      CMax.ID, ;
      T.Name as TeacherName, ;
      c2.Name as CourseName,;
      c2.Length ;
   from ;
      ( select ;
             c.id, ;
             max( c.length ) as CourseMaxLen ;
          from ;
             courses c ;
          group by ;
             c.id ) CMax ;
         JOIN Teachers t ;
            on CMax.ID = t.id ;
         JOIN Courses c2 ;
            on CMax.ID = c2.ID ;
            AND CMax.CourseMaxLen = c2.Length

请注意,课程(c2)的加入是教师的ID和内部查询确定的最大长度。尝试一次一个地解决你的拼图问题,然后根据需要混合在一起。

VFP中的附加选项...由于您正在学习,请构建各个部分并将其查询为临时游标以用于下一步。工作示例也可以使用原始查询

完成
INTO CURSOR 
   C_MaxCoursePerTeacher

然后使用它作为连接,例如......

select
      CMax.ID, ;
      T.Name as TeacherName, ;
      c2.Name as CourseName,;
      c2.Length ;
   from ;
      C_MaxCoursePerTeacher CMax ;
         JOIN Teachers t ;
            on CMax.ID = t.id ;
         JOIN Courses c2 ;
            on CMax.ID = c2.ID ;
            AND CMax.CourseMaxLen = c2.Length

通过这种方式,您可以一次完成一个有效的查询,知道其目的是什么,然后转移到拼图的下一个部分。