SQL查询 - 存在与存在之间的区别

时间:2011-02-16 12:10:15

标签: sql exists

以下两个查询是否始终给出相同的结果?如果没有,为什么不呢?

1)

select PayFrequencyTypeID, PayFrequencyDesc 
from db_uspaybo.tblpayfrequency 
where (PayFrequencyTypeID,1) not in (
   select payfrequencytype,1 
   from tblcustomerpayapproval 
   where fedtaxid='903008887' and payrollyear=year(curdate())
);

2)

select payfrequencytypeid 
from tblpayfrequency 
where not exists (
  select distinct payfrequencytype 
  from tblcustomerpayapproval
);

提前致谢。

5 个答案:

答案 0 :(得分:2)

我认为这就是你想要的'不存在' A.Id和B.Id这里是连接这些表的Pk和FK。(我不知道确切的字段名称)

从tblpayfrequency A中选择payfrequencytypeid 哪里不存在(选择*
来自tblcustomerpayapproval B,其中A.Id = B.Id和B.fedtaxid ='903008887'和B.payrollyear = year(curdate()));

答案 1 :(得分:1)

基本上not innot exists非常相似,通常会产生相同的结果。

不同之处在于,如果集合中的一个值为NULL(至少在Oracle上,则in将返回false,而exists仅检查记录的存在,而忽略它的价值观。

在这种特定情况下,你有一个WHERE子句,它会导致第一个查询返回不同的结果。

第三种方法通常在MySQL上更快,就是在主查询中连接表并检查连接字段是否为NULL:

select payfrequencytypeid 
from 
  tblpayfrequency f
  left join tblcustomerpayapproval a
    on a.payfrequencytype = f.payfrequencytype
where
  a.payfrequencytype IS NULL

其他一般提示:

  1. 您当然可以跳过1
  2. 您在第二个查询中不需要DISTINCT。如果删除它,则允许数据库选择最佳优化路径。
  3. 不存在通常更快,但这也取决于数据库选择的优化路径。您应该在实时服务器和实时数据上尝试这一点以确定。

答案 2 :(得分:1)

简化和标记:

SELECT p, d 
FROM f 
WHERE (p, 1) NOT IN 
    (SELECT t, 1 
    FROM a 
    WHERE i='903008887' 
    AND y = year (curdate()));


SELECT p 
FROM f 
WHERE NOT EXISTS 
    (SELECT DISTINCT t 
    FROM a); 

结果不一样。原因:第一个查询要求输入2列。但是我们无法知道今年的问题是否会产生一些影响,或者对903008887进行过滤。如果过滤有效 - 第二次查询怎么办呢?

答案 3 :(得分:1)

第一个返回db_uspaybo.tblpayfrequency中的一些数据,其中PayFrequencyTypeID不在payfrequencytype表中,并带有这些条件。

第二个不会从db_uspaybo.tblpayfrequency返回任何数据。

答案 4 :(得分:0)

请看以下博客:

IN Vs Exist in SQL

或者,您可以随时谷歌搜索此类问题。