Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.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 server 如何执行;在;子查询仅一次_Sql Server_Subquery - Fatal编程技术网

Sql server 如何执行;在;子查询仅一次

Sql server 如何执行;在;子查询仅一次,sql-server,subquery,Sql Server,Subquery,我有一个缓慢的SQL Server查询: SELECT Style FROM Storage WHERE Style NOT IN (SELECT ValidStyle FROM ValidStyles) 此语法导致对父查询的每一行执行一次从ValidStyles中选择ValidStyle。我如何重写它以只运行一次子查询?我只是在这里猜测一下,但这应该可以 SELECT Style FROM Storage s WHERE NOT EXISTS(SELECT * FROM ValidStyl

我有一个缓慢的SQL Server查询:

SELECT Style
FROM Storage
WHERE Style NOT IN (SELECT ValidStyle FROM ValidStyles)

此语法导致对父查询的每一行执行一次
从ValidStyles中选择ValidStyle
。我如何重写它以只运行一次子查询?

我只是在这里猜测一下,但这应该可以

SELECT Style 
FROM Storage s
WHERE NOT EXISTS(SELECT * FROM ValidStyles vs WHERE vs.ValidStyle=s.Style)
 SELECT S.Style 
 FROM Storage S 
 LEFT OUTER JOIN ValidStyles vs on S.Style = VS.ValidStyle
 WHERE vs.ValidStyle is null

您正在运行哪个版本的SQL Server?不应每行运行一次,并且作为2008或更高版本的规则,
不在
不存在
左联接/为空
检查更有效。您如何确认子查询每行运行一次?此外,ValidStyle是否可以为空?这可能会导致意外的结果。+1从性能角度来看,这比“不在”解决方案和左/外联接要好,并且会完全满足op的要求。我希望我能选择这个作为公认的答案@koppinjo对于几乎所有场景,
不在
不存在
生成完全相同的查询计划和性能。当您查看的列不可为空时,请确保。但事实并非如此,三周前我将SP修改为使用not EXISTS而不是not IN,性能从40秒提高到1秒,逻辑读取减少了80%以上。这些结果在我工作的领域中是典型的。撇开查询计划不谈,它们是不同的,作为一般规则,我认为默认为“不存在”是安全的。不过,这只是我的看法。它仍然在为每一行运行子查询
SELECT Style
FROM Storage S
LEFT JOIN ValidStyles VS
ON
 S.Style = VS.ValidStyle
WHERE VS.ValidStyle IS NULL