Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在WHERE子句中联接或嵌套SELECT以按值列表进行筛选_Sql_Sql Server_Azure Sql Database - Fatal编程技术网

Sql 在WHERE子句中联接或嵌套SELECT以按值列表进行筛选

Sql 在WHERE子句中联接或嵌套SELECT以按值列表进行筛选,sql,sql-server,azure-sql-database,Sql,Sql Server,Azure Sql Database,我有一个表类型,我们称之为ListType,它有1列字符串VARCHAR(50) 我有一个ListType类型的局部变量 它由一些字符串值填充,例如“foo”、“bah”、“something”、“else” 现在,我想将此表类型用作存储过程中的参数,以过滤将返回的表中的结果 我可以想出一些方法来做这件事- 1-加入 SELECT * FROM Table A INNER JOIN @list B ON A.Col= B.String WHERE子句中的2-IN+(选择) SELECT *

我有一个表类型,我们称之为ListType,它有1列字符串VARCHAR(50)

我有一个ListType类型的局部变量

它由一些字符串值填充,例如“foo”、“bah”、“something”、“else”

现在,我想将此表类型用作存储过程中的参数,以过滤将返回的表中的结果

我可以想出一些方法来做这件事-

1-加入

SELECT * FROM Table A
INNER JOIN @list B ON A.Col= B.String
WHERE子句中的2-IN+(选择)

SELECT * 
FROM Table A
WHERE A.Col IN (SELECT [String] FROM @list)
我认为#1比#2更优化,但查询计划似乎非常相似

基础表大约有8500万行,列表中最多有5项。
有什么不同吗?

正如@Gordon Linoff所提到的,看到执行计划就能正确地告诉我们发生了什么

尽管如此,我还是建议您选择选项1,因为它传递基于集合的操作。如果列表项是唯一的,我还建议您在1列中添加索引,它可以带来额外的好处

表值参数的性能与 等效参数数组的实现

将类型ListType创建为表
(
Col1字符串不为空主键
)

使用估计的时间。如果计划看起来相似,并且计划估计值相同,那么它们可能是编译到同一个执行计划。有趣的是,当我有一个列表过滤器时,这两种方法几乎是相同的。添加另一个列表并重复此过程,突然,1比2快得多。