在 Join 条件中使用标量函数

Posted

技术标签:

【中文标题】在 Join 条件中使用标量函数【英文标题】:Use of scalar functions in Join condition 【发布时间】:2018-07-08 04:13:12 【问题描述】:

我正在加入一个表以检索一个值,但为了加入我需要做一些逻辑,因为这两个表都没有一个共同的值。所以逻辑是做一个前 1 并从一个公共表中为两个输入获取一个特定的值。我打算将逻辑放在标量函数中,然后在连接条件中调用它。

我有一个像这样的简单连接

LEFT JOIN <IndexTable> Tbl1 ON Tbl1.PrimaryKey = MainTbl.PrimaryKey

我打算使用用户定义的标量函数将其更改为类似的东西

LEFT JOIN <IndexTable> Tbl1 
ON dbo.fnGetCommonID(Tbl1.PrimaryKey) = dbo.fnGetCommonID(MainTbl.PrimaryKey)

就性能而言,以这种方式使用它好还是有更好的方法。

【问题讨论】:

优化器将无法在带有标量函数的版本中使用连接的ON 条件中的任何索引。第一个版本更可取,假设可以用这种方式表达您的查询。 我可以推荐你发布标量函数吗?可能有人可以帮助有效地实现相同的结果...... 在两个表上创建持久计算列并在计算列上连接 【参考方案1】:

如果可能,请在查询中进行计算,可能使用 OUTER APPLY 而不是 LEFT JOIN:

OUTER APPLY (
    SELECT TOP 1 <at least one field, also values from MainTbl may be used>
    FROM <the set of data you need>
    WHERE <boolean, also values from MainTbl may be used>
    ORDER BY <make the top record the one you want>
) AS Tbl1

【讨论】:

以上是关于在 Join 条件中使用标量函数的主要内容,如果未能解决你的问题,请参考以下文章

sp_executesql vs 用户定义的标量函数

mysql关联left join条件on和where条件的区别及结合coalesce函数

基于标量整数条件的AVX向量寄存器的条件移动(cmov)?

使用标量函数执行查询花费了太多时间

MySQL 子查询

pg中join,left join的使用,将条件放到on和where后面的区别问题