数据库在这里:http://sqlfiddle.com/#!9/bf0171
我想找到大卫教授"大卫教授"类。但是,查找结果是:
Select Student.name from Student, Teacher where Teacher.s_id =Student.id and Teacher.name="Prof. David";
+------+
| name |
+------+
| Tom |
| John |
| Mary |
| Tom |
| John |
| Mary |
+------+
我想结果应该是" Tom"和"约翰"只要。问题是什么?
答案 0 :(得分:2)
如果Student
和Teacher
之间没有加入条件,您将获得Cartesian product(来自Student
的所有记录以及来自Teacher
的所有记录)。
你可能意味着:
SELECT
Student.name
FROM Student s
JOIN Teacher t
ON t.s_id = s.id
WHERE Teacher.name="Prof. David";
对于新的SQL学习者,我强烈建议明确使用JOIN
,LEFT JOIN
等,而不是隐式加入WHERE
子句。它将有助于减少您执行的意外笛卡尔积的数量。
答案 1 :(得分:1)
问题是您有两个表,并且您正在使用查询对这些表执行笛卡尔连接。因此,您在结果中获得3x2 = 6行,每位教师都会显示所有3名学生的姓名。您必须根据模式中的外键关系以逻辑方式连接表。
例如:
Select A.field1, B.field2 from A join B on A.id = B.a_id
答案 2 :(得分:1)
要了解问题所在,请尝试以下方法:
Select Student.name, Teacher.name from Student, Teacher
您将得到一个结果,每个学生都与每位老师合并,无论是否与其他学生有任何关系。您需要添加一个条件来检查教师和学生是否相关:
Select Student.name, Teacher.name from Student, Teacher where Teacher.s_id = Student.id
一旦有了这些条件,您就可以添加更多条件,例如只列出给定教师的学生。
Select Student.name from Student, Teacher where Teacher.s_id = Student.id and Teacher.name=...
答案 3 :(得分:0)
您需要在where处添加join子句。我想你正在努力选择在特定班级中有特定教师的学生。所以,例如,如果你有:
table Student with columns: student_id, name
table Teacher with columns: teacher_id, name
table Class with columns: class_id, class_name, teacher_id
table Class_Assignment with columns class_id, student_id
然后你的查询将是:
Select Student.name from Student, teacher, class_assignment
where Student.student_id = class_assignment.student_id
and Teacher.teacher_id = class_assignment.teacher_id
and Teacher.name="Prof. David";