Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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中不存在对的使用_Sql - Fatal编程技术网

SQL中不存在对的使用

SQL中不存在对的使用,sql,Sql,如果表A有一个int num,表B有一个int q 以下两个查询是否总是给出相同的结果 问题1: 问题2: 谢谢不,它们完全不同。第一个查找A.num大于某些B.q的记录;也就是说,如果有任何B.q小于给定的a.num,那么a.num将出现在结果中。第二个查找A.num大于所有B.q的A记录;也就是说,任何不小于给定a.num的B.q,那么该a.num将不会出现在结果中 假设第二个查询大约是您想要的,那么您应该在第一个查询中将ANY更改为ALL 然而,即便如此,也有一个区别,即它们处理空值的方式

如果表A有一个int num,表B有一个int q

以下两个查询是否总是给出相同的结果

问题1:

问题2:


谢谢

不,它们完全不同。第一个查找A.num大于某些B.q的记录;也就是说,如果有任何B.q小于给定的a.num,那么a.num将出现在结果中。第二个查找A.num大于所有B.q的A记录;也就是说,任何不小于给定a.num的B.q,那么该a.num将不会出现在结果中

假设第二个查询大约是您想要的,那么您应该在第一个查询中将ANY更改为ALL

然而,即便如此,也有一个区别,即它们处理空值的方式不同:

如果B.q为null,那么带有ALL的版本将永远不会返回任何行,因为null表示未知,因此可能任意大,WHERE子句只接受已知满足条件的行,而带有NOT EXISTS的版本将忽略这些null,因为它们被内部WHERE子句过滤掉。 如果A.num始终为null,那么带有ALL的版本将忽略这些null,因为它们被WHERE子句过滤掉了,而带有NOT EXISTS的版本将包含它们,因为它们被内部WHERE子句过滤掉了。
编辑以添加:正如上面的注释所暗示的,这假设B没有任何名为num的列。如果B有一个名为num的列,则不存在的版本实际上是指B.num而不是a.num,其行为也与包含ALL的版本完全不同。这可以通过在子查询中显式写入.num而不是简单地写入num来解决。

答案:假设num为NULL或q为NULL。会发生什么?回答2:检查查询计划。假设B有一列numI,我认为您的逻辑错误。第一个是说A.num大于B.q的最小值。第二个是说B中没有A.num小于该值的行。这是一个双负数,它让你知道a.num大于B.q的某个值-这与你所说的a.num大于B.q的最小值相同。@GordonLinoff,但双负数意味着第二个查询就像说a.num大于B.q的最大值一样
select num
from A
where num>any(select q from B)
select num
from A
where not exists(select * from B where num<=q);