内部联接的顺序可以更改查询的结果

时间:2017-06-15 17:38:44

标签: sql sql-server sql-server-2008 inner-join

我在SQL Server 2008 R2上有以下场景:

以下查询返回:

select * from TableA where ID = '123'; -- 1 rows
select * from TableB where ID = '123'; -- 5 rows
select * from TableC where ID = '123'; -- 0 rows

以下列方式连接这些表时,它返回1行

SELECT A.ID 
  FROM TableA A 
 INNER JOIN ( SELECT DISTINCT ID
              FROM TableB  ) AS D
  ON D.ID = A.ID
 INNER JOIN TableC C 
  ON  A.ID = C.ID 
ORDER BY A.ID

但是,当切换内部联接顺序时,它不会返回任何行

SELECT A.ID 
  FROM TableA A 
 INNER JOIN TableC C 
  ON  A.ID = C.ID 
 INNER JOIN ( SELECT DISTINCT ID
              FROM TableB  ) AS D
  ON D.ID = A.ID
ORDER BY A.ID

这可能吗?

打印屏幕:enter image description here

2 个答案:

答案 0 :(得分:2)

对于内部联接,联接操作的顺序不会影响查询(它可能会影响行和列的排序,但会返回相同的数据)。

在这种情况下,结果集是所有表的笛卡尔积的子集。排序无关紧要。

订单可以并且确实对外部联接很重要。

在您的情况下,其中一个表是空的。因此,笛卡尔积为空,结果集为空。就这么简单。

答案 1 :(得分:0)

正如戈登所提到的,对于内连接而言,连接的顺序并不重要,而当涉及至少一个外连接时它确实很重要;但是,在你的情况下,这没有一个是相关的,因为你是内部连接3个表,其中一个表将返回零行 - 因此所有组合将导致零行。

您无法使用查询重现该问题的不稳定行为,因为它们将始终返回零记录。您可以在最后再试一次,看看您的想法,如果您确实发现了不同之处,请与我们分享。

对于未来,只要你有这样的东西,以插入语句或rextester等形式创建一些虚拟数据,你就可以让别人更容易帮助你。

祝你好运。