我需要对数据库提供一些帮助,在学校我们必须处理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
谢谢。
答案 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
通过这种方式,您可以一次完成一个有效的查询,知道其目的是什么,然后转移到拼图的下一个部分。