没有特定内部联接的SQL查询

时间:2013-12-18 19:43:44

标签: sql sql-server

有时我的同事会给我这样的查询:

SEL c.col1, b.col2, a.somecol, a.somemore
FROM db.tbl1 A, db.tbl2 B, db.tbl3 C
WHERE A.id = B.id and B.otherId = C.otherID
GROUP BY 1,2 ORDER BY 1

我只想澄清这实际意味着什么。是这样的:

SELECT
  c.col1
  b.col2
  a.somecol
  a.somemore
FROM
  db.tbl1 AS A
INNER JOIN db.tbl2 AS B
  ON B.id = A.id
INNER JOIN db.tbl3 AS C
  ON C.otherId = B.otherID
GROUP BY
  c.col1,
  b.col2
ORDER BY
  c.col1

我只是想让事情变得更加清晰和可读,但我想确保从表演的角度来看,我并没有误解任何事情。我也用更易读的名字等替换别名......

3 个答案:

答案 0 :(得分:3)

其他人声称这种方式没有任何好处,但这是不正确的。使用显式连接有好处。使用隐式连接没有任何好处,除非您的数据库太旧而不会使用显式连接。

使用显式连接可防止许多意外交叉连接。

当您真正想要交叉连接时,意图很明确。

隐式连接更难维护,特别是如果您需要更改为左连接,因为混合两个(并且某些数据库不支持隐式的左连接语法)通常会导致错误的结果。

除非您正在处理这样一个旧版本的数据库,否则它只需要隐式连接,因此在更好地发布更多内容之后的20年内写一个是不错的选择。我看到了,他们没有通过代码审查。隐式连接是一种SQL反模式,如果使用现代数据库,则没有理由使用它。

答案 1 :(得分:1)

这与JOIN相同。

SQL于1986年标准化,但在1992年第3次修订之前没有加入。

正如评论者所说,我不知道GROUP BY正在做什么。它们与聚合一起使用。

答案 2 :(得分:-1)

他们正在编写IMPLICIT JOINS,你正在编写EXPLICIT JOINS。几十年来,ANSI联盟试图将这种隐式联接放在一个已弃用的黑名单中,但有许多遗留系统(和传统程序员)。 除了显式连接之外,在一种或另一种形式中没有任何好处更具可读性。在某些地方,你找不到文件告诉连接在where子句之前,但真实的是引擎可以在幕后重新排列它。