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/25.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/9/csharp-4.0/2.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
中带等于vs的sql语句_Sql_Sql Server_Tsql - Fatal编程技术网

中带等于vs的sql语句

中带等于vs的sql语句,sql,sql-server,tsql,Sql,Sql Server,Tsql,假设有人向您走来,说我们将通过在中用替换equals来减少我们编写的SQL量。它既可以用于单个标量值,也可以用于数字列表 SELECT * FROM table WHERE id = 1 或 这些语句是否等同于优化器生成的语句 从表面上看,这看起来很简单,但它导致了简化,原因有二:1。大的SQL块不需要重复,2。我们不会过度使用动态SQL 这是一个虚构的例子,但请考虑下面的内容:>/P> select a.* from tablea a join tableb b on a.id

假设有人向您走来,说我们将通过在中用
替换equals来减少我们编写的SQL量。它既可以用于单个标量值,也可以用于数字列表

SELECT * 
  FROM table 
 WHERE id = 1

这些语句是否等同于优化器生成的语句

从表面上看,这看起来很简单,但它导致了简化,原因有二:1。大的SQL块不需要重复,2。我们不会过度使用动态SQL

<强>这是一个虚构的例子,但请考虑下面的内容:>/P>

select a.* from tablea a 
join tableb b on a.id = b.id
join tablec c on b.id2 = c.id2
left join tabled d on c.id3 = c.id3
where d.type = 1
。。。不止一个案例也是如此

select a.* from tablea a 
join tableb b on a.id = b.id
join tablec c on b.id2 = c.id2
left join tabled d on c.id3 = c.id3
where d.type in (1,2,3,4)
(这甚至不是一个大的声明)


可以想象,您可以进行字符串连接,但鉴于ORM的使用情况,这是不可取的,动态SQL字符串连接总是以良好的意图开始(至少在这些部分)

这两个特定语句相当于优化器(您比较了执行计划吗?),但我认为后者更重要的好处是

WHERE id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5
可以表示为以下更简洁易读的版本(但在语义上与优化器等效):

问题是,当表示为后一种时,大多数人认为他们可以传递字符串,如
@list='1,2,3,4,5'
,然后说:

WHERE id IN (@list)
这不起作用,因为
@list
是单个标量字符串,而不是整数数组


对于只有一个值的情况,我看不出“优化”有什么帮助。您编写的SQL并没有减少,实际上已经编写了更多。你能更详细地描述一下这将如何减少SQL吗?

这两种方法将产生相同的执行计划-表扫描、
索引扫描或
索引搜索
,这取决于你是否/如何对表进行索引


您可以自己查看--请参阅“使用执行计划选项”一节。

它们应该是等效的。请查看执行计划以确定。我认为有比这更合适的样式需要关注,例如表别名,不使用
SELECT*
,等等。查询计划是唯一可以告诉您优化器看到了什么的东西,它可以根据索引和统计信息进行更改。我已经在600万行表上进行了测试。受影响的行数为15万行。响应都是一样的。三条注释:(1)为什么需要字符串连接,(2)如果IN列表作为参数提供,它不会帮助您避免连接,以及(3)您知道,对where子句中的任何d列使用equality/IN会将您的左外部联接转换为右内部联接吗?@AaronBertrand:这是一个简单的示例。我相信您已经看到了一些有时必要的大型SQL语句。现在不要让SQL Server出现在我面前。在继续之前,我需要SQL Server世界的意见。i、 e.不想在没有健全性检查的情况下进行DBMS特定的更改。非常感谢。仍然同意其他人的观点,似乎没有什么合乎逻辑的事情需要改变,目的是什么?难道没有更重要的事情需要关注等价语法之间的交替吗。假设该语句非常庞大,包含大量连接。它会有更少的SQL,因为整个块不会被复制,你也不需要做动态合成。也许你可以在你的问题中展示一个例子,这样我们就可以理解这个“优化”。。。你说的“整个街区”是什么?我看到
其中id=1
。。。
whereid在(1)
SQL中是如何减少的?
WHERE id IN (1,2,3,4,5)
WHERE id IN (@list)