2013-08-01 26 views
0

这什么不对这个数据库查询推荐的方式来编写数据库查询

select 
    abstract_author.name, 
    title, 
    affiliation_number, 
    af_name 
from   
    abs_affiliation_name, 
    abstract_affiliation, 
    abstracts_item, 
    abstract_author, 
    authors_abstract 
where 
    abstracts_item._id = authors_abstract.abstractsitem_id and 
    abstract_author._id = authors_abstract.abstractauthor_id and 
    abstract_affiliation._id = abstract_author._id and 
    abs_affiliation_name._id = abstracts_item._id 

我得到我预期的结果。但是,有人说这不是一种推荐的方式或一种好的做法。你能告诉我什么是推荐的方式来写我的查询(我的意思是哪些加入)?

+0

看到这个有趣的讨论... http://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause – Verma

回答

0

我建议你使用join S和aliases如下

select aath.name, /*alias*/title, /*alias*/affiliation_number,/*alias*/af_name 
from abs_affiliation_name aan 
join abstracts_item ai on aan._id = ai._id  
join abstract_affiliation aa on aa._id = aath._id 
join authors_abstract aAbs on ai._id = aAbs.abstractsitem_id 
join abstract_author aath on aath._id = aAbs.abstractauthor_id 
+0

不应该有一个表名和他们的别名之间的“AS”? – Philipp

+2

这不是必需的 – Parado

1

它不建议做你的加入where子句。相反,最好使用显式JOIN条件。所以你的查询将是

SELECT 
    abstract_author.name 
, title 
, affiliation_number 
, af_name 
FROM abstracts_item 
JOIN authors_abstract ON abstracts_item._id = authors_abstract.abstractsitem_id 
JOIN abstract_author ON abtract_author.id = authors_abstract.abstractauthor_id 
JOIN abstract_affiliation ON abstract_affiliation._id = abstract_author._id 
JOIN abs_affiliation_name ON abs_affiliation_name._id = abstracts_item.id 

我强烈建议你在你的桌子上使用别名,虽然你会避免混淆。在本例中,如果您将标题字段引入其他表中的一个,则该查询很可能会中断,因为它会知道要定位哪个表。我会做这样的事情

SELECT 
    au.name 
, af.title 
, af.affiliation_number 
, af.af_name 
FROM abstracts_item ai 
JOIN authors_abstract aa ON ai._id = aa.abstractsitem_id 
JOIN abstract_author au ON au.id = aa.abstractauthor_id 
JOIN abstract_affiliation af ON af._id = au._id 
JOIN abs_affiliation_name an ON an._id = ai.id 

你需要改变,虽然别名在选择位,因为我已经猜到他们从

0

是哪些表没有没有什么错您查询。这是个人偏好,但是您使用的ANSI-89 impicit连接已超过20年过时,它们在ANSI-92中用明确的JOIN语法替换。

Aaron Bertrand已经写了一个compelling article为什么在大多数情况下可以使用更新的连接语法,以及使用ANSI-89连接的潜在缺陷。在大多数的情况下,两种方法的执行计划将完全相同(假设您没有意外地与implict连接进行交叉连接)。值得注意的是,虽然Oracle会产生不同的执行计划,ANSI-89连接语法可以产生更高效的两种执行计划。 (我已经看到了这个帖子的一个例子,以回应我的一个答案,但目前我找不到它,现在你不得不接受我的话)。然而,我不会将此作为总是使用ANSI-89连接的理由,使用ANSI-92连接语法的另一个关键原因是可以使用ANSI语法实现外部连接,而隐式连接的外部连接语法因DBMS而异。

例如在Oracle

SELECT * 
FROM a, b 
WHERE a.id = b.id(+) 

在SQL-服务器(不推荐)

SELECT * 
FROM a, b 
WHERE a.id *= b.id 

然而,在两个以下工作:

SELECT * 
FROM a 
     LEFT JOIN b 
      ON a.id = b.id 

如果你总是使用明确连接你最终有更加一致(在我看来更可读)的查询。