Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 什么';标准内部联接和内部联接的内部联接之间的区别是什么?_Sql_Tsql - Fatal编程技术网

Sql 什么';标准内部联接和内部联接的内部联接之间的区别是什么?

Sql 什么';标准内部联接和内部联接的内部联接之间的区别是什么?,sql,tsql,Sql,Tsql,有人能解释一下这两者之间的区别吗: SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... 这是: SELECT * FROM A INNER JOIN B INNER JOIN C ON ... ON ... 例如: SELECT A.Something, B.Something, C.Something INTO #TempTable FROM TableA A INNER JOIN TableB B INNER JOIN

有人能解释一下这两者之间的区别吗:

SELECT * FROM A
INNER JOIN B ON ...
INNER JOIN C ON ...
这是:

SELECT * FROM A
INNER JOIN B INNER JOIN C ON ... ON ...
例如:

SELECT A.Something, B.Something, C.Something
INTO #TempTable
FROM TableA A
INNER JOIN TableB B
    INNER JOIN TableC C ON C.FK = B.PK
ON A.JoinField = B.ID

使用
内部联接
没有区别。区别在于
外部连接
起作用时

假设您有以下表格:

表A:

ID          BID
----------- -----------
1           1
2           NULL
3           2
表B:

ID          BVAL
----------- ----------
1           X
2           Y
表C:

BID         CVAL
----------- ----------
1           ABC
如果你再问

SELECT * FROM A
   LEFT OUTER JOIN B
      ON B.ID = A.ID
   INNER JOIN C
      ON C.BID = B.ID
您将获得一条记录:

ID          BID         ID          BVAL       BID         CVAL
----------- ----------- ----------- ---------- ----------- ----------
1           1           1           X          1           ABC
但是这个问题

SELECT * FROM A
   LEFT OUTER JOIN B
      INNER JOIN C
         ON C.BID = B.ID
      ON B.ID = A.ID
将给出三个:

ID          BID         ID          BVAL       BID         CVAL
----------- ----------- ----------- ---------- ----------- ----------
1           1           1           X          1           ABC
2           NULL        NULL        NULL       NULL        NULL
3           2           NULL        NULL       NULL        NULL

如您所见,嵌套的
联接在另一个联接之前进行计算。

内部联接没有区别。区别在于
外部连接
起作用时

假设您有以下表格:

表A:

ID          BID
----------- -----------
1           1
2           NULL
3           2
表B:

ID          BVAL
----------- ----------
1           X
2           Y
表C:

BID         CVAL
----------- ----------
1           ABC
如果你再问

SELECT * FROM A
   LEFT OUTER JOIN B
      ON B.ID = A.ID
   INNER JOIN C
      ON C.BID = B.ID
您将获得一条记录:

ID          BID         ID          BVAL       BID         CVAL
----------- ----------- ----------- ---------- ----------- ----------
1           1           1           X          1           ABC
但是这个问题

SELECT * FROM A
   LEFT OUTER JOIN B
      INNER JOIN C
         ON C.BID = B.ID
      ON B.ID = A.ID
将给出三个:

ID          BID         ID          BVAL       BID         CVAL
----------- ----------- ----------- ---------- ----------- ----------
1           1           1           X          1           ABC
2           NULL        NULL        NULL       NULL        NULL
3           2           NULL        NULL       NULL        NULL

如您所见,嵌套的
联接在另一个联接之前进行计算。

联接并不总是在表之间。它们经常介于以前的
JOIN
s结果之间。因此,连接顺序很重要

在第一个查询中,我们将表
A
连接到表
B
。在第一个
ON
子句中,我们只能参考表
A
B
。假设这会产生一个结果,我们将非正式地称之为
a_B
。然后,第二个连接发生在
A_B
C
之间。第二个
ON
子句可能包含对
A
B
C
的引用,但要明确的是,
A
B
引用实际上是对第一个
JOIN
生成的
A\u B
结果的引用

在第二个查询中,我们首先将表
B
连接到表
C
。在第一个
ON
子句(与第二个
JOIN
子句相关)中,我们只能参考表
B
C
。我们将该结果称为
B_C
。第二个
ON
子句完成了第一个
JOIN
,将
A
连接到
B\u-C
,第二个
ON
子句可以再次引用
A
B
C
,但这次
B
C
是对
B\u-C>的引用

可视化如何匹配
JOIN
ON
子句的最清晰的方法是将
JOIN
视为一个左括号和
ON
上的
一样。然后,匹配的括号表示
s上的哪个
与哪个
JOIN
匹配,嵌套告诉您连接发生的顺序



1尽管这些差异在仅使用
内部连接和
上的每个
连接时并不重要,事实上,它们只引用两个表中的一个表。

连接并不总是在表之间。它们经常介于以前的
JOIN
s结果之间。因此,连接顺序很重要

在第一个查询中,我们将表
A
连接到表
B
。在第一个
ON
子句中,我们只能参考表
A
B
。假设这会产生一个结果,我们将非正式地称之为
a_B
。然后,第二个连接发生在
A_B
C
之间。第二个
ON
子句可能包含对
A
B
C
的引用,但要明确的是,
A
B
引用实际上是对第一个
JOIN
生成的
A\u B
结果的引用

在第二个查询中,我们首先将表
B
连接到表
C
。在第一个
ON
子句(与第二个
JOIN
子句相关)中,我们只能参考表
B
C
。我们将该结果称为
B_C
。第二个
ON
子句完成了第一个
JOIN
,将
A
连接到
B\u-C
,第二个
ON
子句可以再次引用
A
B
C
,但这次
B
C
是对
B\u-C>的引用

可视化如何匹配
JOIN
ON
子句的最清晰的方法是将
JOIN
视为一个左括号和
ON
上的
一样。然后,匹配的括号表示
s上的哪个
与哪个
JOIN
匹配,嵌套告诉您连接发生的顺序



1尽管这些差异在仅使用
内部
联接以及在
上的每个
联接时通常并不重要,实际上,它们只引用两个表中的一个表。

结果将是相同的。
如果只使用内部联接

但第一种方法是标准和正确的方法。
它更具可读性,也不容易混淆

它如何影响解释计划?这取决于数据库。
SQL是一种声明性语言。我们问的是我们想要什么,而不是如何把它拿出来。
(至少在不使用t-SQL的情况下)

下面是一个T-SQL示例,演示结果是相同的。

两者都会导致:

ID_A ID_B ID_C
---- ---- ----
12   22   32

结果将是相同的。
如果只使用内部联接

但第一种方法是标准和正确的方法。
它更具可读性,也不容易混淆

它如何影响解释计划?这取决于数据库。
SQL是一种声明性语言。我们问的是我们想要什么,而不是如何把它拿出来。
(至少在不使用t-SQL的情况下)

下面是一个T-SQL示例,演示结果是相同的。

两者都会导致:

ID_A ID_B ID_C
---- ---- ----
12   22   32

请在提交任何查询之前测试一次。除了第一个是有效的,第二个是无效的join之外,没有什么可说的了