我在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
这可能吗?
答案 0 :(得分:2)
对于内部联接,联接操作的顺序不会影响查询(它可能会影响行和列的排序,但会返回相同的数据)。
在这种情况下,结果集是所有表的笛卡尔积的子集。排序无关紧要。
订单可以并且确实对外部联接很重要。
在您的情况下,其中一个表是空的。因此,笛卡尔积为空,结果集为空。就这么简单。
答案 1 :(得分:0)
正如戈登所提到的,对于内连接而言,连接的顺序并不重要,而当涉及至少一个外连接时它确实很重要;但是,在你的情况下,这没有一个是相关的,因为你是内部连接3个表,其中一个表将返回零行 - 因此所有组合将导致零行。
您无法使用查询重现该问题的不稳定行为,因为它们将始终返回零记录。您可以在最后再试一次,看看您的想法,如果您确实发现了不同之处,请与我们分享。
对于未来,只要你有这样的东西,以插入语句或rextester等形式创建一些虚拟数据,你就可以让别人更容易帮助你。
祝你好运。