在 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 条件中使用标量函数的主要内容,如果未能解决你的问题,请参考以下文章