不要使用自然连接

时间:2016-07-08 10:09:24

标签: sql-server-2008

我正在与我的TL讨论自然联接,他说不应该使用自然连接,所以在什么情况下我们不会使用自然连接,equjoin和内连接。

1 个答案:

答案 0 :(得分:1)

请重新解释您的问题,例如自然加入和内部联接之间的含义是什么? ' JOINS中这些SQL Server 2008有哪些限制?

SQL Server摆脱了自然联接,因此它们的使用也有可扩展的方面。没有过于具体,NATURAL JOIN基本上就像INNER JOIN,除了它

  • A)会返回不同的(想想INTERSECT / UNION,但表格可以有不同的列)
  • B)在所有可用列上隐式添加EQUI JOIN

插图:请注意,这是在SQL Server 2012中设计的

  DECLARE @TableA TABLE (Col1 VARCHAR(10)
                       , Col2 VARCHAR(10) );
  DECLARE @TableB TABLE (Col1 VARCHAR(10)
                       , Col2 VARCHAR(10)
                       , Col3 VARCHAR(10) );
  INSERT INTO @TableA (Col1, Col2)
  VALUES ('C', 'D');
  INSERT INTO @TableB (Col1, Col2, Col3)
  VALUES ('C', 'D', 'E');

  SELECT *
  FROM  @TableA
  NATURAL JOIN (SELECT Col1, Col2, Col3
                FROM    @TableB) AS B

  -- returns
  Col1 | Col2 | Co3
  'C'    'D'    'E'

  SELECT *
  FROM  @TableA AS A
  INNER JOIN (SELECT Col1, Col2, Col3
              FROM  @Table B) AS B ON A.Col1 = B.Col1
                                  AND A.Col2 = B.Col2

  -- returns A = @TableA, B = @TableB
  A.Col1 | B.Col1 | A.Col2 | B.Col2 | B.Col2
    'C'     'C'      'D'      'D'      'E'

你看到了区别吗?相当重要,不是吗?使用Inner,您仍然可以比较两个表格的结果,但Natural JOIN就像INTERCEPT一样,只是将组合在一起。您丢失了结果集中的关系。

<强>结论:

  • 每个人都有权获得自己的意见,但SQL无论如何都会解析您的查询。
  • 了解联接的工作原理有助于您了解这些联接可以起作用的业务用途......或者至少可以使用其他SQL种语言。
  • TSQL删除NATURAL JOIN,取而代之的是UNIONUNION ALLINTERSECTEXCEPT

如果可以,请向您的TL询问“为什么?”使用一个或另一个的业务逻辑背后。了解他如何理解SQL查询。你可能会得到一些有见地的东西或者......好吧,准备好听听非传统的事情......但至少你正在学习更多关于SQL,你的公司以及如何提问的事。

胜利/胜利,我说。