SQL查询-存在与中的差异
以下两个查询是否总是给出相同的结果?若否,原因为何 (一) (二)SQL查询-存在与中的差异,sql,exists,Sql,Exists,以下两个查询是否总是给出相同的结果?若否,原因为何 (一) (二) 提前感谢。查看以下博客: 或者,您也可以通过谷歌搜索此类问题。查看以下博客: 或者,你也可以搜索这类问题。基本上不在和不存在非常相似,通常产生相同的结果 不同之处在于,中的如果集合中的某个值为NULL(至少在Oracle上为NULL),则将返回false,而exists仅检查记录是否存在,取消记录其值 在这个特定的例子中,您得到了一个WHERE子句,它将导致第一个查询返回不同的结果 在MySQL上通常更快的第三种方法是在主查
提前感谢。查看以下博客:
或者,您也可以通过谷歌搜索此类问题。查看以下博客:
或者,你也可以搜索这类问题。基本上
不在
和不存在
非常相似,通常产生相同的结果
不同之处在于,中的如果集合中的某个值为NULL(至少在Oracle上为NULL),则将返回false,而exists
仅检查记录是否存在,取消记录其值
在这个特定的例子中,您得到了一个WHERE子句,它将导致第一个查询返回不同的结果
在MySQL上通常更快的第三种方法是在主查询中左键联接表,并检查联接字段是否为空:
select payfrequencytypeid
from
tblpayfrequency f
left join tblcustomerpayapproval a
on a.payfrequencytype = f.payfrequencytype
where
a.payfrequencytype IS NULL
其他一般提示:
当然,您可以跳过1
您不需要在第二个查询中使用DISTINCT。如果删除该优化路径,则允许数据库选择最佳优化路径
Not exists通常比in更快,尽管这也取决于数据库选择的优化路径。您确实应该在实时服务器和实时数据上尝试这一点
基本上,不在
和不存在
非常相似,通常产生相同的结果
不同之处在于,
中的如果集合中的某个值为NULL(至少在Oracle上为NULL),则将返回false,而exists
仅检查记录是否存在,取消记录其值
在这个特定的例子中,您得到了一个WHERE子句,它将导致第一个查询返回不同的结果
在MySQL上通常更快的第三种方法是在主查询中左键联接表,并检查联接字段是否为空:
select payfrequencytypeid
from
tblpayfrequency f
left join tblcustomerpayapproval a
on a.payfrequencytype = f.payfrequencytype
where
a.payfrequencytype IS NULL
其他一般提示:
当然,您可以跳过1
您不需要在第二个查询中使用DISTINCT。如果删除该优化路径,则允许数据库选择最佳优化路径
Not exists通常比in更快,尽管这也取决于数据库选择的优化路径。您确实应该在实时服务器和实时数据上尝试这一点
简化和标记:
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);
结果将不一样。原因:第一个查询需要两列。但我们无法知道今年的问题是否有影响,或者对903008887的过滤是否有影响。如果过滤有效果-如何通过第二个查询完成?简化并标记:
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);
结果将不一样。原因:第一个查询需要两列。但我们无法知道今年的问题是否有影响,或者对903008887的过滤是否有影响。如果过滤有效果-第二个查询怎么做?第一个查询从db_uspaybo.tblpayfrequency返回一些数据,其中他们的PayFrequencyTypeID不在payfrequencytype表中,并且带有这些条件
第二个不从db_uspaybo.tblpayfrequency返回任何数据 第一个返回db_uspaybo.tblpayfrequency中的某些数据,其中其PayFrequencyTypeID不在payfrequencytype表中,且具有这些条件
第二个不从db_uspaybo.tblpayfrequency返回任何数据 我想这就是你想要的“不存在”
A.Id和B.Id这里是连接这些表的Pk和FK。(我不知道确切的字段名)
从tblpayfrequency A中选择payfrequencytypeid
不存在的位置(选择*
来自tblcustomerpayapproval B,其中A.Id=B.Id,B.fedtaxid='903008887',B.payrollyear=year(curdate()) 我想这就是你想要的“不存在”
A.Id和B.Id这里是连接这些表的Pk和FK。(我不知道确切的字段名)
从tblpayfrequency A中选择payfrequencytypeid
不存在的位置(选择*
来自tblcustomerpayapproval B,其中A.Id=B.Id,B.fedtaxid='903008887',B.payrollyear=year(curdate()) 你试过自己运行它吗?为什么?第一个有一个WHERE
条件,该条件在第二个中的任何位置都没有出现,并且还选择了一个附加列。@Sachin-dupe是关于性能的,这是关于语义的。链接问题中的答案没有提到notin
withNULL
将返回一个空结果集。为什么不简化此问题的名称?为什么要在tablename前面加tbl?和:请在将来使用代码标签。谢谢。@user unknown:我也不明白“tbl”前缀(如果使用了,为什么不在每一列前面加上“col”…)你试过自己运行它吗?为什么?第一个有一个WHERE
条件,该条件在第二个中的任何位置都没有出现,并且还选择了一个附加列。@Sachin-dupe是关于性能的,这是关于语义的。链接问题中的答案没有提到notin
withNULL
将返回一个空结果集。为什么不简化此问题的名称?为什么要在tablename前面加tbl?和:请在将来使用代码标签。谢谢。@user unknown:我也不明白“tbl”前缀(如果使用了它,为什么不在每一列前面加上“col”…)非常感谢你能告诉我使用exists opt的查询在哪里可以获得与inthanks相同的数据吗?非常感谢maryam我得到了it结果我更改了a.payfrequencytypeid=b.payfrequencytype代替了a.id=b.IDI非常感谢maryam我得到了it结果我更改了a、 payfrequencytype id=b.payfrequencytype代替a.id=b.id