在我的使用SQL服务器的项目中Microsoft有很多实例,其中有各种SQL查询的形式为WHERE fieldValue IN (value1, value2, value3)
或fieldValue NOT IN (<set of values>)
。为了在代码中管理这些实例,值集在单独的配置文件中定义,其中为集分配了一个名称,类似于valueSet['setName'] = [value1, value2, value3]
,然后可以在需要时按名称检索这些集,并将其提供给 ORM 查询。
我现在想将这些集合定义移动到数据库:两个表,一个用于集合(id、名称、描述(,另一个用于集合内容(集合 id、值(。并且,实现可在 SQL 查询中使用的自定义函数。
我可以想到两种方法:
1( 标量功能
WHERE dbo.isValueInSet(fieldValue, 'setName') = 1
2( 表值函数
a(WHERE fieldValue IN (SELECT * FROM dbo.valueSet('setName'))
或 b(INNER JOIN dbo.valueSet('setName') ON fieldValue = idFieldFromSet
,我认为它不比 (a( 变体有效或更有效。
我不确定也许有更好的方法。我还担心性能:如果我实现标量值函数,这是否意味着将为表中的每一行调用它?这感觉就像是一件非常无效的事情。在这方面,表值函数感觉是更好的选择。但也许还有另一种方法可以实现这一点,它比我描述的两种选择中的任何一种都更有效?
不要做标量。
不要执行表函数。 优化器假定返回 1 行,这种情况很少发生,并且偶尔会导致不适当的查询计划。
我会继续你正在做的事情或嵌入完整的查询,删除函数:
WHERE fieldValue IN (SELECT VAL FROM VALUE_TABLE where VAL_SET_NAME='setName')