如果查询包含具有多个连接约束的连接,是否按从左到右的顺序评估约束,或者SQL Server是否决定评估它们的最佳方式?
为了澄清,我会试着解释我为什么要问。假设我有一个名为 Alpha 的表,除了标准ID之外还有两列。第一列名为 Generic1 ,是varchar(20)。第二个名为类型,是 smallint 。如果 Type = 1 ,则 Generic1 的值实际上是另一个表中记录的 ID (我们称之为 Bravo < /强>)。如果 Type = 2 ,那么 Generic1 的值将是一些纯文本值。
我想写下面的查询:
select * from Beta b
left outer join Alpha a on a.Type = 1 and a.Generic1 = b.ID
如果我可以放心地假设SQL Server只会尝试比较 a.Generic1 = b.ID ,那么它已经比较 a.Type = 1 ,那么我不必担心演员/转换错误。我希望SQL避免使用仅在SQL Server中有效的语法。
我猜测SQL Server会根据需要对它们进行评估,因此我必须添加 CAST 才能安全。
答案 0 :(得分:3)
为什么你有这样的混合列?听起来应该与Bravo
建立FK关系,目前可能无法执行。
无论如何,假设您坚持使用此架构,SQL Server中不会保证评估顺序。您需要执行类似
的操作... ON a.Type = 1 AND CASE WHEN ISNUMERIC(a.Generic1) = 1
THEN a.Generic1 END = b.ID
/* Result of "CASE" implicitly cast to int*/
(尽管您可能希望使用方法specifically for integers,但isnumeric
并不能保证某个值会成功转换为int
)
答案 1 :(得分:2)
1)永远不要依赖执行计划来确保不匹配的数据类型匹配。
2)是的,SQL Server 将首先评估a.Type = 1。有时。没有保证,但一般来说,当两个语句都计算为数值时,不会抛出任何错误。
3)仍然不依赖它。如果您绝对必须使用依赖于类型的数据模型的歪曲来确定另一个字段是否属于特定数据类型,请包含CAST语句。