Tsql 使用动态数据集连接表

Tsql 使用动态数据集连接表,tsql,function,views,common-table-expression,Tsql,Function,Views,Common Table Expression,在我的查询中,我希望将动态数据集(基于参数检索)与现有表连接起来。我正在研究什么是完成这个场景的最佳选择,最后我缩小到3个选项 视图、CTE、功能、CTE+功能 查询将类似于 select id from table where id not in (select id from dynamic_set (param1, param2) ) 鉴于此,我必须提取所有数据,而不能对其进行过滤 函数必须为表中的每一行运行,所以它可能会影响查询性能 CTE和函数的组合与使用函数本身几乎相同,只有行可

在我的查询中,我希望将动态数据集(基于参数检索)与现有表连接起来。我正在研究什么是完成这个场景的最佳选择,最后我缩小到3个选项

视图、CTE、功能、CTE+功能

查询将类似于

select id from table
where id not in (select id from dynamic_set (param1, param2) )

  • 鉴于此,我必须提取所有数据,而不能对其进行过滤
  • 函数必须为表中的每一行运行,所以它可能会影响查询性能
  • CTE和函数的组合与使用函数本身几乎相同,只有行可以被过滤和优化以获得更好的性能
  • CTE和temp表相似,所以我的问题是,大量的数据会影响性能吗
我想听听你对最佳解决方案的意见


感谢您的参与

视图不会提取所有数据,它更像是一个命名查询,可用于其他查询。过滤视图时,它只是将该过滤器添加到该视图中定义的查询中

CTE查询更像是一个本地视图,它只能在定义的位置被引用(后面;后面)。而且这不是具体化的,我不知道任何具体化CTE查询的方法,就像我们对视图所做的那样(通过添加聚集索引)


函数是最糟糕的选择,你说了为什么。如果“内联”查询仅在此处使用,我会选择CTE方式。

“使用视图,我必须提取所有数据,而不能对其进行筛选。”这是错误的,除非视图有聚集索引。“CTE类似于临时表”这也是错误的。@AdrianIftode:By“提取所有数据”我的意思是,任何高级逻辑都必须在主查询中重新创建,以便优化视图并将其与原始表连接起来。我一直在寻找一个可以让我们面向对象的解决方案,而view并不是这样的解决方案。TSQL不是面向对象的。@AdrianIftode:我不确定你参与这个主题的真正目的是什么,因为你对这个解决方案没有任何评论。我完全知道SQL不是OODBMS,但我指的是一个可重用的解决方案。现在清除?SQL Server是否支持以下内容?在使用函数时也需要考虑这一点。虽然,对于大多数函数,您仍然是对的,因为函数不能像SQL那样由Optimizer进行强大的转换