如果连接条件进行仅对某些行有效的数据转换,但您的 where 条件将行过滤为“有效”行,那么这是一个“安全”连接条件吗?
我认为不是,但我绝不是专家,我只是想理解。AFAIK 优化器几乎可以做任何它想做的事情,只要在一天结束时所有的连接都发生并且所有的条件最终都会运行。
我试过用谷歌搜索,但没有看到任何具体的东西
SELECT *
FROM (SELECT 1 AS ID) a
JOIN (SELECT '1' AS ID,
'Y' AS FILTER
UNION
SELECT 'NOT_AN_INT' AS ID,
'N' AS FILTER) b
ON a.ID = CONVERT(INT, b.ID)
WHERE b.FILTER = 'Y'
SELECT *
FROM (SELECT 1 AS ID) a
JOIN (SELECT '1' AS ID,
'Y' AS FILTER
UNION
SELECT 'NOT_AN_INT' AS ID,
'N' AS FILTER) b
ON a.ID = CONVERT(INT, b.ID)
AND b.FILTER = 'Y'
据我了解,连接条件在内部连接上应该是可交换的,并且这两个查询应该彼此等价。然而,由于类型强制问题,第二个爆炸了。这是否证明这是一种不好的做法,您应该安全地将 a 的 ID 转换为 varchar 而不是 b 的 ID 转换为 int?或者是否有一些 ansi 规范保证这没问题?