`
keepwork
  • 浏览: 325032 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle--交集、并集、差集、笛卡尔积

阅读更多

开发者博客www.developsearch.com

 

并集:
使用 UNION 运算符组合多个结果
SELECT name,num FROM Table1
UNION
SELECT name,num FROM Table2
注意:查询的字段个数必须相同,Table2的字段类型要跟Table1的相同.
如果使用 UNION 运算符,那么单独的 SELECT 语句不能包含其自己的 ORDER BY 或 COMPUTE 子句。只能在最后一个 SELECT 语句的后面使用一个 ORDER BY 或 COMPUTE 子句;该子句适用于最终的组合结果集。GROUP BY 和 HAVING 子句只能在单独的 SELECT 语句中指定。
只用UNION有重复记录只取一条,用UNION ALL 时取所有重复记录
FULLl JOIN是表示并集
SELECT * FROM Table1 FULLl JOIN Table2 ON table1.id=table2.id

交集:
例1:SELECT * FROM table1 AS a JOIN table2 AS b ON a.name =b.name

例2:新折扣方案(检查组合维度是否存在交集)

 

FUNCTION COUNT_DMNSN(IN_DMNSN_A IN NUMBER, IN_DMNSN_B IN NUMBER) RETURN NUMBER AS
    V_COUNT NUMBER;
  BEGIN
    -- 任意一方为-1(全选) 都表示存在交集 将V_COUNT手工置值为1
     IF (IN_DMNSN_A = -1 OR IN_DMNSN_B = -1) THEN
       V_COUNT := 1;

     -- 两者都不为-1的情况需要铺开判断是否存在交集
     ELSE
       SELECT COUNT(0)
       INTO V_COUNT
       FROM (SELECT D.CODE
               FROM CDH_NEWRBT_SET_DMNSN D
              WHERE D.DMNSN_ID = IN_DMNSN_A
             INTERSECT
             SELECT D.CODE
               FROM CDH_NEWRBT_SET_DMNSN D
              WHERE D.DMNSN_ID = IN_DMNSN_B);

     END IF;
     -- 返回结果
     RETURN V_COUNT;
  END;

 

差集:
NOT IN 表示差集
SELECT * FROM table1 WHERE name NOT IN (SELECT name FROM table2)

笛卡尔积:
SELECT * FROM table1 CROSS JOIN table2
没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
不过,如果添加一个 WHERE 子句,则交叉联接的作用将同内联接一样。
注意:不能使用ON 关键字,只能用WHERE条件

union 和join不一样,union这个运算子是将资料列合并,而join是将栏位合并(我前面所讲)!
如果从栏位合并来讲,full join 算是并集,inner join 算是交集!left join 或right join 不完全是差集,也包括交集的结果,具体你的语句的查询结果如何还是要看实际的语句,就如cross join,加上where就变成inner join,前后的结果相差甚远 。

 

 

  • 大小: 12.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics