我在SQL Server2008 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这是可能的吗?
打印屏幕:

发布于 2017-06-16 01:45:24
对于内部联接,联接操作的顺序不会影响查询(它可能会影响行和列的顺序,但会返回相同的数据)。
在这种情况下,结果集是所有表的笛卡尔乘积的子集。顺序并不重要。
顺序可以而且确实对外部连接很重要。
在您的示例中,其中一个表是空的。因此,笛卡尔乘积为空,结果集也为空。就是这么简单。
发布于 2017-06-16 02:34:11
正如戈登提到的,对于内部连接,连接的顺序并不重要,而当至少涉及一个外部连接时,连接的顺序才是重要的;但是,在您的示例中,这一切都不相关,因为您是内连接3个表,其中一个表将返回零行-因此所有组合都将导致零行。
您不能复制查询的不稳定行为,因为它们总是返回零记录,如本问题所示。你可以在你的一端再试一次,看看你想出了什么,如果你确实发现了不同之处,请届时与我们分享。
将来,只要您有这样的事情,以insert语句或rextester或类似的形式创建一些虚拟数据,您就可以让别人更容易地帮助您。
祝你好运。
https://stackoverflow.com/questions/44573683
复制相似问题