知识大全 深入了解Oracle 10g新的多重集运算符

Posted

篇首语:读书和学习是在别人思想和知识的帮助下,建立起自己的思想和知识。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 深入了解Oracle 10g新的多重集运算符相关的知识,希望对你有一定的参考价值。

深入了解Oracle 10g新的多重集运算符  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Oracle g 中针对 SQL Server 新添加了一系列支持 Advanced Multiset 的运算符 他们可以用于对 Oracle 数据库中的嵌套表进行处理 这个SQL 新语法具有强大的功能 并弥补了 Oracle i中对于嵌套表的不足之处 但是用户手册中给出的相关例子非常复杂 很难了解到这些新函数的使用方法     下面举个非常简单的例子来说明一下 假设我们要使用一个记录了整型数据的嵌套表 在创建嵌套表时 首先必须为将要创建的表指定一个表名 这个表将用来存放嵌套表的数据     create or replace type num_tab_typ as table of number;  /  create table num_tab (num num_tab_typ)  nested table num store as num_tab_store;    然后往表中插入一些数列 这些数列分别为从 到 的数字 以及一些奇数数字和偶数数字 然后对其进行查询     insert into num_tab values (num_tab_typ( ));  insert into num_tab values (num_tab_typ( ));  insert into num_tab values (num_tab_typ( ));  select num from num_tab;    NUM     NUM_TAB_TYP( )  NUM_TAB_TYP( )  NUM_TAB_TYP( )    多重集运算符 EXCEPT 可以实现查询中查询出不包含于另一个嵌套表的所有的值 例如在下面这个例子中 查询语句可以查出在嵌套表中除了 以外其他所有的值     select num multiset except num_tab_typ( ) num from num_tab;    NUM     NUM_TAB_TYP( )  NUM_TAB_TYP( )  NUM_TAB_TYP( )    多重集运算符INTERSECT 则是与 Except 相反 它可以返回在两个嵌套表中相同的值 那么 如果使用一个嵌套表 表中只有一个数字 那么如果在原来的嵌套表中没有 则返回的结果为一个空集 但是如原来的嵌套表中确实存在 那么返回的结果就是 如下面的例子所示     select num multiset intersect num_tab_typ( ) num from num_tab    NUM     NUM_TAB_TYP( )  NUM_TAB_TYP( )  NUM_TAB_TYP()    多重集运算符UNION 返回的是这两个嵌套表中所有的值 并将这些值结合到一个嵌套表中 如下例     select num multiset union num_tab_typ( ) num from num_tab;    NUM     NUM_TAB_TYP( )  NUM_TAB_TYP( )  NUM_TAB_TYP( )    大家可以注意到 在嵌入表中的值不一定是唯一的 正如上面的例子 使用 UNION 运算符后 在最后的结果中有两项出现了重复的值 如果你想只保留嵌套表中不重复的值 那么你只需要向下面这个例子中一样 在语句中加上关键字DISTINCT 就可以除去重复的值     select num multiset union distinct num_tab_typ( ) num from num_tab;    NUM     NUM_TAB_TYP( )  NUM_TAB_TYP( )  NUM_TAB_TYP( )    对于每个嵌套表的多重集运算符 都只会从每个集合中选择一个值来进行合并或者排除 也就是说在两个嵌套表中如果出现重复的值 那么对于重复的值只有一个会被除去 例如 num_tab_typ( ) MULTISET EXCEPT num_tab_typ( ) 的运行结果将会是num_tab_typ( )     在 Oracle g 中 你可以比较两个嵌套表是否相等 只要这两个表中的元素个数相等并且值也相等 那么这两个嵌套表就是相等的 而与这两个表中元素的顺序无关     select num from num_tab where num = num_tab_typ( );    NUM     NUM_TAB_TYP( )    select num from num_tab where num = num_tab_typ( );    NUM     NUM_TAB_TYP( )    select num from num_tab where num = num_tab_typ( );    no rows selected    你还可以使用CARDINALITY 函数来得到某个嵌套表中元素的个数     select cardinality(num) from num_tab;    CARDINALITY(NUM)                数据库认为不存在重复值的嵌套表是一个SET 事实上 存在函数SET 它可以通过删除嵌套表中重复的数据从而将一个嵌套表转化成一个SET 同样还有一个新的 SQL 子句——IS A SET 在嵌套表中不存在重复值的时候返回真值     select num from num_tab where num is a set;    NUM     NUM_TAB_TYP( )  NUM_TAB_TYP( )  NUM_TAB_TYP( )    select num from num_tab where num multiset union num_tab_typ( ) is a set;    NUM     NUM_TAB_TYP( )    现在你也可以使用IS EMPTY 这个新的SQL 子句来判断嵌套表中的值是否为空     select num from num_tab where num multiset intersect  num_tab_typ( ) is empty;    NUM     NUM_TAB_TYP( )    除此之外 还有另外一个新的 SQL 子句 是用于判断某个值是否是一个嵌套表的成员 如下例所示     select num from num_tab where member of num;    NUM     NUM_TAB_TYP( )  NUM_TAB_TYP( )    select num from num_tab where not member of num;    NUM     NUM_TAB_TYP( )    你也可以通过使用 SUBMULTISET 来判断一个嵌套表是否是一个多重集的子集     select num from num_tab where num_tab_typ( ) submultiset of num;    NUM     NUM_TAB_TYP( )  NUM_TAB_TYP( )    最后 还有一个非常有趣的函数——POWERMULTISET 它可以得到某个给定的多重集的所有子集 下面给出了关于这个函数的一个例子     create or replace type num_tab_tab_typ as table of num_tab_typ;  /  show errors;    select cast(powermultiset(num) as num_tab_tab_typ) from num_tab  where num = num_tab_typ( );    CAST(POWERMULTISET(NUM)ASNUM_TAB_TAB_TYP)     NUM_TAB_TAB_TYP(NUM_TAB_TYP( ) NUM_TAB_TYP( ) NUM_TAB_TYP( )   NUM_TAB_TYP( ) NUM_TAB_TYP( ) NUM_TAB_TYP( ) NUM_TAB_TYP( ))    你还可以使用 POWERMULTISET_BY_CARDINALITY 来约束 POWERMULTISET 函数的返回结果 最后的结果必须满足其包含元素的个数等于某个指定的值 还是以上面的那个例子为例 下面有一段代码 功能是返回所有只包含了两个元素的子集     select cast(powermultiset_by_cardinality(num ) as num_tab_tab_typ) num  from num_tab  where num = num_tab_typ( );    NUM     NUM_TAB_TAB_TYP(NUM_TAB_TYP( ) NUM_TAB_TYP( ) NUM_TAB_TYP( )) cha138/Article/program/Oracle/201311/17950

相关参考

知识大全 oracle10g新特性—物化视图

  Advisor       在g将查询重写并且引进了新的强大的调优建议者使管理物化视图变得容易多了  物化视图(Materia

知识大全 深入了解Oracle数据字典

深入了解Oracle数据字典  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  首先Oracle的字

知识大全 Oracle通配符,运算符的使用

Oracle通配符,运算符的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  oracle通配

知识大全 面向Java开发人员的Scala指南: 深入了解Scala并发性 了解 actor 如何提供新的应

面向Java开发人员的Scala指南:深入了解Scala并发性了解actor如何提供新的应  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后

知识大全 在T-SQL中实现Oracle的MINUS集合运算符

在T-SQL中实现Oracle的MINUS集合运算符  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 oracle常用函数汇总

以下是对oracle中的常用函数进行了汇总介绍需要的朋友可以过来参考下   一运算符算术运算符+*/可以在select语句中使用连接运算符||selectdeptno||dnamefromd

知识大全 10g树形查询新特性

  在g中Oracle提供了新的伪列CONNECT_BY_ISCYCLE通过这个伪列可以判断是否在树形查询的过程中构成了循环这个伪列只是在CONNECTBYNOCYCLE方式下有效  这一篇描述一下解

知识大全 Oracle10g恢复试验方法

Oracle认证:Oracle10g恢复试验方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!看了

知识大全 Oracle10G常用维护语句

Oracle10G常用维护语句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  创建表空间    

知识大全 Oracle10g中current

Oracle10g中current  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  以下的文章主要