有人可以帮助我了解'选择0来自'
delete from table1
where cond1 and cond2 and cond3
and not exists
( select 0 from table2 where cond1 and cond2 )
我试着研究一些正在讨论这个问题的SO线程,但是在简短的阅读中谈到优化等等,有点太复杂了。对于这里发生的事情有什么简单的解释吗? ?
答案 0 :(得分:2)
SELECT 0 FROM table
不返回表的任何列值,而是返回table
的每一行的常量 - 例如如果你有下表
TABLE
id | name | age
0 | John | 12
1 | Jack | 22
2 | Martin | 42
以及以下声明
SELECT 0 FROM table WHERE age > 10
这将导致
0
0
表示ID为1和2的两个匹配行。
答案 1 :(得分:1)
exists
检查以下子查询是否返回了一些内容,表示该连接至少有一个链接(如果子查询正在加入,则伪代码中不清楚)。
子查询返回的内容完全无关紧要。在这种情况下,它是0
。
答案 2 :(得分:1)
如果子查询返回1(或更多行),则不会执行DELETE。
答案 3 :(得分:1)
这个惯用的SQL是:
delete from table1
where cond1 and cond2 and cond3
and not exists
( select * from table2 where cond1 and cond2 )
重点关注的重要关键字是exists
。因此,如果table1
,cond1
和cond2
都为真,并且{{}中有没有行,此查询将从cond3
删除行1}}其中(内部)table2
和cond1
为真。
某些数据库产品(特别是SQL Server的古老版本,我认为2000版之前的版本)实际上比给定cond2
形式所需的工作更多,因此替换常量变为传统做法值(exists (select * ...
或0
),以便它不会去检索任何实际数据。正如我所说,我们只是检查行是否存在,我们不关心它们的内容。
在您使用的任何版本的SQL Server中,1
都可以,优化程序可以理解它。其他数据库产品可能有也可能没有此表单的问题。
答案 4 :(得分:0)
实际上,根据您的查询,SELECT 0
仅验证WHERE
子句中的条件。
因此,如果条件为真,则子查询将返回0
。
然后NOT EXISTS
将检查您的子查询是否返回了值。换句话说,如果子查询中设置的条件为DELETE
,它将NOT EXIST
。