这两个查询的差异

时间:2015-06-09 16:53:19

标签: sql oracle11g oracle-sqldeveloper

这2个查询有何不同?我在Oracle SQL中得到了不同的结果,你能解释一下它的区别吗?



***First Query***
SELECT *
FROM 
TABLE1,
TABLE2
WHERE TABLE1.COL_ID   = TABLE2.COL_ID
AND TABLE1.COL1 = 'ABC'
AND TABLE2.COL1 = 'ABC'
AND TABLE1.COL2 = 2015
AND TABLE1.COL3 = 'X';

***Second Query***
SELECT *
FROM 
TABLE1,
TABLE2,
TABLE3
WHERE TABLE1.COL_ID   = TABLE2.COL_ID
AND TABLE1.COL1 = 'ABC'
AND TABLE2.COL1 = 'ABC'
AND TABLE1.COL2 = 2015
AND TABLE1.COL3 = 'X';




2 个答案:

答案 0 :(得分:2)

是的,SQL处理器假定您暗示JOIN所有三个表:table1,table2,table3

如果您没有SQL引擎可以处理它,则不需要显式声明join子句。

当您使用逗号分隔两个(或更多)表名时,您想要的是笛卡尔积。 “左”表的每一行将与右表的“匹配”(连接)。

现在,如果你在where子句中写一些东西,就像在这个'连接'上设置一个条件,告诉哪些行“连接”哪些行。

这实际上是“加入”行:)因此join关键字有助于提供更具可读性的语法,并且您确实想要加入一些常见值更容易理解。

答案 1 :(得分:1)

假设您进行此查询:

Select * from 
 myTable1 ,myTable2

你将得到(myTable1行号)x(myTable2行号)因为没有连接条件你将把第一个表中的每一行与第二个表中的每一行组合起来,这称为笛卡儿积,连接是{{3} }。

在您的情况下,第一个查询包含cross join,因为使用了WHERE TABLE1.COL_ID = TABLE2.COL_ID,在第二个查询中,第一个连接的结果与表TABLE3交叉连接。