我可以在选择中跳过加入吗?

时间:2016-10-25 16:35:04

标签: sql oracle11g

当学习联接时,我们的教练说不要跳过表格。

例如,让我们执行>>> '0' >= 10 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unorderable types: str() >= int() SelectsLast_NameFirst_name的查询。

我会写

Numeric_Grade

他说要写

Select Last_Name, First_Name, Numeric_Grade
From Student 
Join Grade
Using(Student_id)

我很困惑,因为只要我能通过类似的领域将它们联系起来,我就不会看到注册的重点。 除了图表所示的内容之外,他没有给我一个通过报名的理由。按照图表。

我必须通过注册吗?这是安全的方式,还是无关紧要因为成绩和学生有Select Last_Name, First_Name, Numeric_Grade From Student Join Enrollment Using(Student_id) Join Grade Using(Student_id) 主键?

enter image description here

3 个答案:

答案 0 :(得分:2)

如果您需要该表中的信息(字段),则通过注册表的唯一原因是。如果Enrollment和Grade表都有Student_id字段,那么您无需通过Enrollment即可到达那里。

在你的例子中,看起来你正在寻找名字和姓氏,它应该来自学生表和Numeric_Grade,它应该来自成绩表。在这种情况下,不需要注册表。如果有一个WHERE子句需要Enrollment表中的某些内容,那么是的,你需要包含它,但是你的例子我会说它不需要。

如果这是一个关于考试或作业的问题而老师要求你通过报名表我也会这样做只是为了安抚他,但知道你实际上不需要这样做来获取信息你需要的。

答案 1 :(得分:2)

取决于你的牌桌。有时你可以但有时候不会。

例如,在注册时想象一下student_quit_course

然后你可能只希望学生的成绩真正完成课程,你需要所有三个表

对于这种特殊情况,您将有多个GRADE section_id,但要了解您需要的部分[Section] and [Course],请使用[Enrollment]加入

答案 2 :(得分:2)

在Oracle SQL中引用Alice Rischert示例,实验7.2:

第二个选择是将GRADE表中的STUDENT_ID直接连接到STUDENT表的STUDENT_ID,从而完全跳过ENROLLMENT表。 - - 此快捷方式完全可以接受,甚至如果它不遵循主键/外键关系路径。在这种情况下,您可以确保不构建笛卡尔积,因为您可以在STUDED表中为GRADE表中的每个STUDENT_ID仅保证一个STUDENT_ID。另外,它还消除了连接;因此,查询执行得更快,并且需要更少的资源。对于这个小的结果集,效果可能相当微不足道。