"FROM"中的INNER JOIN与多个表名的区别

35 浏览
0 Comments

"FROM"中的INNER JOIN与多个表名的区别

这个问题在这里已经有了答案:

可能有重复:

INNER JOIN versus WHERE clause — any difference?

内连接查询语句与隐式连接查询语句(即在FROM关键字后列出多个表)之间有什么区别?

例如,给出以下两个表:

CREATE TABLE Statuses(
  id INT PRIMARY KEY,
  description VARCHAR(50)
);
INSERT INTO Statuses VALUES (1, 'status');
CREATE TABLE Documents(
  id INT PRIMARY KEY,
  statusId INT REFERENCES Statuses(id)
);
INSERT INTO Documents VALUES (9, 1);

以下两个SQL查询语句之间有什么区别?

从我所做的测试中,它们返回相同的结果。它们做的事情是否相同?是否有情况它们将返回不同的结果集?

-- Using implicit join (listing multiple tables)
SELECT s.description
FROM Documents d, Statuses s
WHERE d.statusId = s.id
      AND d.id = 9;
-- Using INNER JOIN
SELECT s.description
FROM Documents d
INNER JOIN Statuses s ON d.statusId = s.id
WHERE d.id = 9;

admin 更改状态以发布 2023年5月25日
0
0 Comments

如果您使用的是第一种方式,年龄在30岁以下的人可能会对您嗤之以鼻,但只要您使用了内连接,它们会产生相同的结果,而且优化器会生成相同的执行计划(至少我所能感知到的是如此)。

当然,这要求第一个查询中的Where子句必须是您在第二个查询中连接的方式。

顺便说一下,这可能会被关闭为重复内容。

0
0 Comments

完全没有理由使用隐式连接(也就是用逗号连接的那种方式)。虽然在使用内连接的时候它返回的结果是一样的,但是在复杂查询中它容易造成意外的交叉连接,而且由于左/右外连接语法在SQL Server中已经被弃用,所以在不同的厂商中其语法也存在差异,对于维护来说就更加困难了。既然应该避免在同一查询中混合使用隐式连接和显式连接(这可能会导致错误的结果),那么如果需要将某些东西更改为左连接,就必须重新编写整个查询语句。

0