sql join中连接列顺序的最佳实践?

时间:2014-06-26 10:45:32

标签: sql

我的办公室正在按照sql join中连接列的顺序进行大讨论。我发现很难解释它,所以我只提出两个sql语句。哪一个更好地考虑到sql最佳实践?

SELECT a.Au_id 
FROM   AUTHORS a 
       INNER JOIN TITLEAUTHOR ta 
         ON a.Au_id = ta.Au_id 
       INNER JOIN TITLES t 
         ON ta.Title_id = t.Title_id 
WHERE  t.Title LIKE ‘%Computer%’ 

OR

SELECT a.Au_id 
FROM   AUTHORS a 
       INNER JOIN TITLEAUTHOR ta 
         ON ta.Au_id = a.Au_id
       INNER JOIN TITLES t 
         ON t.Title_id = ta.Title_id
WHERE  t.Title LIKE ‘%Computer%’ 

因此,在联接中,在ON部分,是否写A.x = B.y or B.y = A.x是否重要?

5 个答案:

答案 0 :(得分:2)

这里的最佳做法是选择一个并坚持在团队中。就个人而言,我更喜欢FROM a JOIN b ON b.col = a.col,因为它对我来说似乎更清晰。

答案 1 :(得分:2)

SQL被设计为像通常的英文文本一样可读。在通常的文本中,当我们要指定任何提及的对象时,我们说的是“一个对象。该对象类似于该对象,该对象与该对象相关,并且该对象具有那些属性”。我们不会说“该对象就像该对象,对于与该对象相关的那个对象,并且那些属性具有该对象”。

因此,当我们将TableB的记录添加到TableA的查询中时,我们需要指定必须具有TableB的记录才能满足TableA的当前记录的内容。因此我们必须说,我们需要来自TableB的记录,该记录的ID等于TableA.ID。 FROM TableA a JOIN TableB b ON b.col = a.col。我们必须严格按此顺序编写,以方便阅读和理解这种关系。

我非常难过,几乎所有的SQL文档都没有提供任何推理来解决这个问题,但是有很多示例错误地按表的顺序编写方程式参数在查询中。

答案 2 :(得分:1)

我一直使用选项1,这也是orcale在SQL和PL / SQL课程中教授它的方式。

关于最佳实践的主题,

你曾经使用的那个oracle还教的是1或2个字母表别名..虽然这在当时看起来像个好主意但它使得编写语句/过程/函数分配更容易(当时)可能很难再回来看看以后的同一段代码。

e.g。 我们有许多PL / SQL函数正在查看/从数十个表中提取数据,虽然别名在你的脑海中很新鲜,但很好,但是在几年内回到相同的代码并且它会变得很粘。

我并不是说不要使用表别名,但我总是尽量避免分配地方/人教的1或2个字母。

(不仅仅是关于联接的主题,而是关于最佳实践的主题)

答案 3 :(得分:0)

无论如何,数据库查询优化器将决定执行查询的最佳方式,无论您如何订购连接条件,甚至是where子句。

http://docs.oracle.com/cd/B10501_01/server.920/a96533/optimops.htm#39473详细解释了oracle优化器处理连接的方式。

答案 4 :(得分:0)

请参阅以下链接,其中结论是ON子句中的顺序不会影响结果。 数据库优化器将决定执行查询的最佳方式和计划。

http://weblogs.sqlteam.com/joew/archive/2008/02/29/60542.aspx