2016-04-30 88 views
0

我正在读一本关于SQL的书,我被困在一个与数据库模式相关的例子中,如下图所示。 THE DATABASE SCHEMA将WHERE子句与NATURAL JOIN SQL一起使用?

下面的例子解决了在书中指出查询:“用的课程,他们教的冠军一起列出导师 的名字”

假设我们希望回答查询的查询可以写在 SQL如下:

select name , title 
from instructor natural join teaches , course 
where teaches.course id = course.course id; 

现在书指出

“需要注意的是teaches.course ID 在其中CL ause引用自然连接结果的course id字段,因为该字段又来自教授关系。 “

再次在书中状态BOLD说:

”这是不可能的使用属性包含原始关系名称的名称,例如instructor.name或teaches.course ID,是指属性的自然加入结果;但是,我们可以使用属性名称,如 名称和课程ID,但不包含关系名称。“

(请参阅上面的查询)如果不可能,那么作者如何能够将查询写为

teaches.course id = course.course id 

如何teaches.course指自然连接属性“场”中,笔者已经隐约这样提出他的arguments.Please给我解释一下作者的观点。

+0

SQL Server不支持'NATURAL JOIN',所以问题不能与该数据库有关。 –

+0

问题是关于sql语言的一般问题,而不是关于sql server的问题。我刚刚用它作为附加标签。 –

+2

'从教练自然结合教',课程'我会说:烧书! “自然加入”通常被认为是邪恶的,并且与旧式的通用结合在一起,这是无法承认的。 – wildplasser

回答

5

忽略什么书有要说NATURAL JOIN。只要避免它。NATURAL JOIN是一个等待发生的错误。为什么?T他只是通过在表中的列上命名约定来定义连接键 - 使用碰巧具有相同名称的任何列。其实,NATURAL JOIN忽略了正确定义的FOREIGN KEY关系;并且它们隐藏了实际用于匹配的键。

因此,请明确指出,并使用ONUSING子句代替。这些都清楚地说明了使用的密钥,并且代码更易于理解和维护。

然后,遵循一个简单的规则:永不FROM子句中使用逗号; 始终使用使用明确的JOIN语法。

所以,写您的查询的好办法是这样的:

select i.name, c.title 
from instructor i inner join 
    teaches t 
    on t.instructor_id = i.instructor_id inner join 
    course c 
    on t.course_id = i.course_id; 

注意,没有where条款,所有列都是合格的,这意味着他们指定他们都来自该表。

此外,我没有在teaches表中看到instructor_id列,所以这只是合理代码的一个例子。

+0

非常感谢你 –