我需要一些数据库方面的帮助,在学校我们必须使用Fox Pro(我知道它很旧,但我能做什么),其中一项任务如下:"列出每位老师最长的课程"。
我们的表格是
课程->idc(主键),id,名称,长度
教师->id(主键),名称
使用select命令有什么方法可以做到这一点吗?最后必须有两栏我相信是teachers.name和courses.name…我的意思是,老师必须是独一无二的,并且在旁边有课程的最大值,但只能来自他/她正在教授的课程。。。
我试过:
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
--->那件事一直持续下去,没有结果。
一段时间后,我设法做了一些事情,但形式非常糟糕,我相信必须有更好的方法:
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
谢谢。
是的,其他人一直在给你带来困难,但现在你知道要展示你在解决问题方面认真尝试了什么。虽然没有一个对你有用,但我会边解释边尽力帮助你。
首先,只从课程表开始,因为它有我们之后可以合作的老师的ID。这是一个简单的分组子句。
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
通过这种方式,您可以一次完成一个工作查询,知道它的用途,然后转到下一块拼图。