确切地说何时用户内部联接或替代查询

时间:2017-12-13 10:10:52

标签: sql inner-join oracle12c

SELECT .... FROM TABLE1 T1, TABLE2 T2, TABLE3 T3
WHERE T1.NAME = 'ABC' AND T1.ID = T2.COL_ID AND T2.COL1 = T3.COL2

VS

SELECT .... FROM TABLE1 T1
WHERE T1.NAME = 'ABC'
INNER JOIN TABLE2 T2 ON T1.ID = T2.COL_ID 
INNER JOIN TABLE3 T3 ON  T2.COL1 = T3.COL2

两个问题

  1. 在表现方面,表现会更好,为什么?

  2. 如果选项2具有更好的性能,何时应该使用选项1? (反之亦然,如果选项1具有更好的性能,则问题)

2 个答案:

答案 0 :(得分:1)

第二个查询不正确。它应该是:

var final = getNum( str ) * 1.05;

这是编写连接条件的正确方法。第一个被接受,但技术上创造了一个笛卡尔积。所有现代数据库都完美地处理第一和第二个查询,并以相同的方式解释它们,因此,性能应该是相同的。但是,你仍然应该使用第二个,因为它更具可读性,并允许你只有一种方法来编写连接,无论是内部,左边还是外部。

答案 1 :(得分:0)

答案很简单:不要使用逗号分隔的连接(第一次查询)。我们在20世纪80年代使用这些来缺少更好的东西,但是在1992年新的语法(第二个查询)被引入 1 ,因为旧的语法容易出错(它更容易忘记应用连接标准)并且更难维护(在查询中是否缺少连接标准?)并且外连接没有标准语法。

1 Oracle虽然采用了新语法,但有点晚了。他们在2001年在Oracle 9i中引入了新的ANSI连接。

在性能方面:速度应该没有区别,因为DBMS优化器看到这基本上是相同的查询。

顺便说一句,你的第二个查询在语法上是不正确的。查询的WHERE子句属于完整的FROM子句之后,即在所有连接之后:

SELECT .... 
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.col_id 
INNER JOIN table3 t3 ON t2.col1 = t3.col2
WHERE t1.name = 'ABC';