什么是'从'中选择0做这种代码?

时间:2015-01-14 11:28:55

标签: sql

有人可以帮助我了解'选择0来自'

delete from table1
    where cond1 and cond2 and cond3
        and not exists
        ( select 0  from table2 where cond1 and cond2 )

我试着研究一些正在讨论这个问题的SO线程,但是在简短的阅读中谈到优化等等,有点太复杂了。对于这里发生的事情有什么简单的解释吗? ?

5 个答案:

答案 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。因此,如果table1cond1cond2都为真,并且{{}中有没有行,此查询将从cond3删除行1}}其中(内部)table2cond1为真。

某些数据库产品(特别是SQL Server的古老版本,我认为2000版之前的版本)实际上比给定cond2形式所需的工作更多,因此替换常量变为传统做法值(exists (select * ...0),以便它不会去检索任何实际数据。正如我所说,我们只是检查行是否存在,我们不关心它们的内容。

在您使用的任何版本的SQL Server中,1都可以,优化程序可以理解它。其他数据库产品可能有也可能没有此表单的问题。

答案 4 :(得分:0)

实际上,根据您的查询,SELECT 0仅验证WHERE子句中的条件。 因此,如果条件为真,则子查询将返回0

然后NOT EXISTS将检查您的子查询是否返回了值。换句话说,如果子查询中设置的条件为DELETE,它将NOT EXIST