1
Select book_id,title
from   Publisher
natural join Book natural join Category
where Publisher.name='thomas hardy' AND Category.name='computer science';
4

2 回答 2

2

只是避免natural join。它会查找相同的列,您可能会在某个地方漏掉一个。例如,我创建的几乎所有表都有一CreatedAt列。这将导致NATURAL JOIN失败。

相反,包括一个USING子句或显式ON

Select book_id,title
from Publisher join
     Book 
     using (Publisher_Id) join
     Category
     using (Category_Id)
where Publisher.name = 'thomas hardy' AND Category.name = 'computer science';

事实上,谜团已经解开了。将NATURAL JOIN尝试name用作键。而且,我猜没有出版商的名称与类别名称完全匹配。

于 2014-12-02T21:25:29.910 回答
0

如果您使用自然连接,则意味着您的表将连接共享相同名称的字段。Publisher 表和 Category 表中的字段之一是Name这意味着自然联接将在这些字段上联接。

然后,您可以按不同的条件过滤这两个字段。两个表连接后,两个字段不能有不同的值。

这将类似于编写:

Select foo FROM bar WHERE foo="something" and foo="Something Else"

这没有道理。自然连接很好,但你几乎总是最好明确你的 JOIN 标准,即使它感觉有点多余。毕竟......代码中的注释通常是多余的,但只有一个混蛋不会使它们。

于 2014-12-02T21:26:26.443 回答