从表面上看,IN和EXITS的SQL语句是可互换和等效的。然而,它们在处理UULL数据时会有很大的差别,并导致不同的结果。问题的根源是在一 个Oracle数据库中,一个NULL值意味着未知变量,所以操作NULL值的比较函数的结果也是一个未知变量,而且任何返回NULL的值通常也被忽略。 例如,以下查询都不会返回一行的值:
select 'true' from dual where 1 = null;
select 'true' from dual where 1 != null;
只有IS NULL才能返回true,并返回一行:
select 'true' from dual where 1 is null;
select 'true' from dual where null is null;
当你选择使用IN,你将会告诉SQL选择一个值并与其它每一值相比较。如果NULL值存在,将不会返回一行,即使两个都为NULL。
select 'true' from dual where null in (null);
select 'true' from dual where (null,null) in ((null,null));
select 'true' from dual where (1,null) in ((1,null));
一个IN语句在功能上相当于= ANY语句:
select 'true' from dual where null = ANY (null);
select 'true' from dual where (null,null) = ANY ((null,null));
select 'true' from dual where (1,null) = ANY ((1,null));
当你使用一个EXISTS等效形式的语句,SQL将会计算所有行,并忽略子查询中的值。
select 'true' from dual where exists (select null from dual);
select 'true' from dual where exists (select 0 from dual where null is null);
IN和EXISTS在逻辑上是相同的。IN语句比较由子查询返回的值,并在输出查询中过滤某些行。EXISTS语句比较行的值,并在子查询中过滤某些行。对于NULL值的情况,行的结果是相同的。
selectename from emp where empno in (select mgr from emp);
selectename from emp e where exists (select 0 from emp where mgr = e.empno);
然而当逻辑被逆向使用,即NOT IN 及NOT EXISTS时,问题就会产生:
selectename from emp where empno not in (select mgr from emp);
selectename from emp e where not exists (select 0 from emp where mgr =
e.empno);
NOT IN语句实质上等同于使用=比较每一值,如果测试为FALSE或者NULL,结果为比较失败。例如:
select 'true' from dual where 1 not in (null,2);
select 'true' from dual where 1 != null and 1 != 2;
select 'true' from dual where (1,2) not in ((2,3),(2,null));
select 'true' from dual where (1,null) not in ((1,2),(2,3));
这些查询不会返回任何一行。第二个查询语句更为明显,即1 != null,所以整个WHERE都为false。然而这些查询语句可变为:
select 'true' from dual where 1 not in (2,3);
select 'true' from dual where 1 != 2 and 1 != 3;
你也可以使用NOT IN查询,只要你保证返回的值不会出现NULL值:
selectename from emp where empno not in (select mgr from emp where mgr is not
null);
selectename from emp where empno not in (select nvl(mgr,0) from emp);
通过理解IN,EXISTS, NOT IN,以及NOT EXISTS之间的差别,当NULL出现在任一子查询中时,你可以避免一些常见的问题。
原文地址:http://www.kuqin.com/article/17mysql/2005041812275611291.html
相关推荐
在SAP BW(Business Warehouse)系统中,用户退出(User Exits)是一种关键的自定义和扩展机制,它允许客户根据自身业务需求对标准SAP交易进行调整和优化,而无需直接修改原始代码。这样做可以降低维护成本,因为当...
在SAP系统中,"User Exits"、"Customer Exits"、"BAdIs"(Business Add-Ins)和"BTEs"(Business Transaction Events)是四种关键的扩展机制,它们允许用户根据业务需求定制标准软件功能。下面将详细阐述这四种技术...
在应用目标上,以pgbench_accounts和pgbench_branches为例,我们可以通过四种不同的方式编写查询语句:使用IN子句、使用ANY子句、使用EXISTS子句和使用INNER JOIN。每种方式都有其特点和适用场景。例如,当需要判断...
这种方法不仅简洁高效,而且易于理解和实现。 需要注意的是,`System.exit(0)`方法的使用需谨慎,因为它会立即终止整个Java虚拟机(JVM),在某些情况下可能不是最佳实践。在实际开发中,可以根据具体需求调整退出...
### 经典SQL语句与效率分析 在数据库管理领域,SQL(Structured Query Language)作为标准的数据查询语言,其重要性不言而喻。...通过对经典SQL语句的深入理解与实践,可以显著提升数据库操作的效率和性能。
在美赛(Mathematical Contest in Modeling, MCM/ICM)中,参赛队伍需要在限定时间内对给出的实际问题进行数学建模,这通常包括问题理解、模型建立、求解、验证和报告撰写等多个步骤。本题的关键在于如何将疏散问题...
标题:“PM USER EXITS” 描述:此文档详细介绍了在SAP PM(Plant Maintenance)模块中的用户出口(User Exits),并特别关注了ABAP语言的使用。用户出口是SAP系统提供的一种定制化机制,允许企业在标准流程中插入...
Tor退出安装 npm install tor-exits用法 var tor = require ( 'tor-exits' ) ;tor . fetch ( function ( err , data ) { if ( err ) return console . error ( err ) ; var nodes = tor . parse ( data ) ; console ...
Customer Exits是另外一种扩展机制,它提供了多种类型的扩展点,包括FM Exits、Menu Exits和Screen Exits。 * FM Exits:在FM中include保留的Z程序来提供功能扩展点。 * Menu Exits:在GUI状态中预留+Fcode菜单项,...
逻辑优化包括对表进行逻辑分割、使用占位符语句、将耗时的操作通过存储过程等在用户较少的情况下执行、尽量不使用 * 号、选择有效的表名、Where 字句规则、使用 Exits Not Exits 替代 In Not in、合理使用事务、合理...
9. **程序结构和调试**:理解ABAP4的程序结构,如使用REPORT、FORM和ENDFORM等语句,以及如何使用SAP的内置调试器进行问题排查。 10. **面向对象编程**:随着ABAP7的引入,ABAP4增加了面向对象的特性,如类、对象、...
- 使用 Enhancement Spot和User Exits,进行功能增强。 六、ABAP Web Dynpro 除了传统的ABAP编程,本教程可能还会介绍ABAP与Web技术的结合,如ABAP Web Dynpro,用于构建现代用户界面的应用程序。 七、SAP开发流程...
ABAP(Advanced Business Application Programming)是SAP公司开发的一种编程语言,主要用于开发SAP系统中的业务应用程序。在“ABAP基础知识”这个...通过掌握这些知识,你可以更好地理解和开发SAP系统中的应用程序。
最后,课程可能还会涉及ABAP工作流和增强技术,如使用Sequences、 BADIs(Business Add-Ins)和User Exits,以适应企业特定的业务需求。 通过【SAP BC402 课程中文自学笔记.pdf】,学习者可以逐步掌握ABAP编程的...
- **重要性**:语句数量过多可能表明函数功能过于复杂,难以理解和维护。 ##### 2.10 Average Size of Statements (AVGS) **度量元名称**:语句平均承载的信息量。 **解释说明**: - **计算公式**:AVGS = (N1 + ...
【标题】"Business-Exits-Bank-of-Canada-project"是一个与加拿大商业出口银行相关的项目,可能涉及到金融、经济和数据分析等领域。...这个项目不仅需要技术实力,还需要对金融市场的深刻理解和对政策影响的敏锐洞察。
IBM 大型计算机平台下进行EXIT安装教程,英文原版。
2. **ABAP语法**:学习ABAP的基本语法结构,包括数据类型、变量声明、控制流语句(如IF、LOOP)、函数模块、类和对象等。 3. **报表开发**:掌握如何使用ABAP开发报表,例如员工名单报表、薪资统计报表等,这涉及到...
在SE38 transaction中,可以使用ABAP/4代码来实现用户出口的逻辑,例如,可以使用IF语句来判断用户的输入数据,然后根据不同的输入数据执行不同的逻辑操作。 SAP用户出口的优点是:可以不影响标准SAP源代码,也不...