以下两个查询是否始终给出相同的结果?如果没有,为什么不呢?
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
);
提前致谢。
答案 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 in
和not 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
。答案 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)