繁体   English   中英

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

[英]SQL queries - difference between exists and in

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

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
);

提前致谢。

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

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

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

区别在于,如果集合中的值之一为NULL(至少在Oracle上为in ),则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. 尽管存在还取决于数据库选择的优化路径,但不存在通常更快。 您应该确实在实时服务器和实时数据上尝试此操作。

简化和标记:

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的过滤是否有效果。如果该过滤有效果-第二个查询怎么做?

第一个从db_uspaybo.tblpayfrequency返回一些数据,其中在这些条件下,其PayFrequencyTypeID不在payfrequencytype表中。

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

查看以下博客:

IN与SQL中存在的关系

另外,您也可以始终通过谷歌搜索此类问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM