Sql server 2008 不使用自然连接
我和我的TL就自然连接进行了辩论,他告诉我不应该使用自然连接,所以在什么情况下我们不使用自然连接,Equaljoin和go使用内部连接。请重新表述您的问题,比如自然连接和内部连接之间的含义是什么?”SQL Server 2008中这些Sql server 2008 不使用自然连接,sql-server-2008,Sql Server 2008,我和我的TL就自然连接进行了辩论,他告诉我不应该使用自然连接,所以在什么情况下我们不使用自然连接,Equaljoin和go使用内部连接。请重新表述您的问题,比如自然连接和内部连接之间的含义是什么?”SQL Server 2008中这些联接的限制是什么 SQL Server摆脱了自然连接,因此它们的使用也有一个可扩展的方面。在不太具体的情况下,自然连接本质上类似于内部连接 A)返回不同的列(想想相交/联合,除非表可以有不同的列) B)在所有可用列上隐式添加一个EQUI-JOIN 插图:注意,这
联接的限制是什么
SQL Server摆脱了自然连接,因此它们的使用也有一个可扩展的方面。在不太具体的情况下,自然连接
本质上类似于内部连接
- A)返回不同的列(想想
相交
/联合
,除非表可以有不同的列)
- 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'
你看到区别了吗?相当重要,不是吗?使用internal,您仍然可以比较两个表的结果,但是自然连接
就像截取
,只是它将列分组在一起。您将失去结果集中的关系
结论:
- 每个人都有权发表自己的意见,但不管怎样,
SQL
都会对您的查询进行相同的解析
- 了解连接的工作方式有助于您了解这些连接可以起到什么样的业务用途…或者至少可以与其他
SQL
语言一起工作
TSQL
删除了自然连接
,以支持联合
,联合所有
,相交
和除外
如果可以,询问TL使用其中一个的业务逻辑背后的“原因”。了解他是如何理解SQL查询的。您可能会得到一些有见地的东西,或者……嗯,准备好聆听非传统的东西……但至少您正在学习更多关于SQL、您的公司以及如何提问的知识
我说是赢/赢。我假设TL代表团队领导?他说不要使用自然连接,所以不要使用它们。有什么问题吗?你的问题到底是什么?可能是重复的,因为我不能多次标记它:这个问题不是关于代码(可能对DBA更好,但即使是这样,它也有以下内容),太广泛,太固执己见,重复:/@RichBenner,就像说“好吧,我们一直都是这样做的。”当然,Abhay需要尊重他的权威,但甚至不想学习SQL?不可能。@clifton_h是的,我明白。我的问题是一个一句话的问题,除了有一场辩论这一事实外,没有任何研究迹象或讨论信息。另外,这个问题对我来说也没有任何意义,如果期望得到有意义的回答,应该不难理解这个问题。感谢您知道我清楚NAUTRAL JOIN和Internal JOIN,请您帮助了解为什么EqualJoin和FULLJOIN在sql server中使用较少。“sql server摆脱了自然连接”-但是,现在,您看到了,在SQL Server中使用NATURAL JOIN
。该语句中是否缺少版本号?或者你真正的意思是什么?还有,“它将列分组在一起。你将失去结果集中的关系。”在我看来,它加强了这种关系。将用于连接的两个列返回给您,这两个列显然只有两个保证相同值的副本,所以这实际上不是一个损失。或者,我还是遗漏了什么?@下划线\u d它被标记为SQL 2008,并且通过关联丢失,如果使用CTE,您将无法区分类似列上的表(这不是一个太大的问题)。@下划线\u d如果您有更好的方法来描述数据的分组方式,我希望听到它。