我知道(没有order by
子句)SQL不对结果集的顺序做出任何保证。但是,对于涉及一个或多个联接的查询,我可以对结果集中相关项的连续性做出任何假设吗?
例如,如果我有像
这样的查询select * from A left join B on P(x) left join C on Q(x)
我可以假设与 A
中特定行对应的所有记录在结果集中都是连续的吗?
答案 0 :(得分:1)
不,你不能。除非存在order by
子句,否则永远不会指定查询结果。
这是一个真实的例子,结果不是连续的。并行散列连接根据连接键分隔不同处理器上的表。然后在结果可用时编译结果。因此,一些结果来自一个处理器,一些来自另一个处理器,依此类推。
或者,在另一种情况下,您可能正在使用索引查找。但是,SQL Server可能决定在A而不是B上使用索引,并在B而不是A中顺序遍历行。相同的id可能在表B中出现多次。因此,给定的行A可能会出现在结果中,无论B.id = A.id。