`FROM _,_`和`FROM _ INNER JOIN _ ON _`之间有什么区别?

时间:2011-07-28 00:50:38

标签: sql sql-server

两者有什么区别?

SELECT [EmployeeList].[Emp_ID], [EmployeeLevel].[LevelPosition]
FROM [EmployeeList], [EmployeeLevel]

SELECT [EmployeeList].[Emp_ID], [EmployeeLevel].[LevelPosition]
FROM EmployeeList INNER JOIN EmployeeLevel ON 
[EmployeeList].[LevelID] = [EmployeeLevel].[LevelID]

无论字段名称如何。

5 个答案:

答案 0 :(得分:9)

第一个不以任何方式相关,并且将返回来自2个表的每个行的每个排列的交叉连接/笛卡尔连接。您需要添加WHERE子句

SELECT [EmployeeList].[Emp_ID], [EmployeeLevel].[LevelPosition]
FROM [EmployeeList], [EmployeeLevel]
WHERE [EmployeeList].[LevelID] = [EmployeeLevel].[LevelID]

然后它们在语义上是相同的,但上面是旧式ANSI语法,并且除了Joe Celko之外的所有人都基本上不鼓励由于不太明确和可能导致无意的笛卡尔连接(以及更多如果要转换为外部联接,则可以更改。

答案 1 :(得分:5)

答案 2 :(得分:3)

首先,您要选择员工ID列表和级别职位列表。 (他们之间没有必然的关系)。

在第二个你正在加入。您将员工列表(给定其级别)与具有相同级别的员工联系起来(参见ON条件)。

答案 3 :(得分:2)

第一个是笛卡尔积连接,它不关心两个表之间的匹配行。它创建了table1中每行的每个组合以及table2中每一行的列表。除非有特定情况需要它,否则这种查询会产生太多意义不大的数据。

第二个匹配具有相同ID的行。

答案 4 :(得分:1)

第一个显示EmployeeList和EmployeeLevel表中的所有数据...... 在第二个查询中,LevelID与EmployeeList和EmployeeLevel之间存在关系,INNER JOIN意味着必须匹配EmployeeList.LevelID和EmployeeLevel.LevelID ... 所以第二个查询显示数据是否匹配LevelID ....