Oracle如何利用交叉连接生成数字序列 |
Oracle用交叉连接生成数字序列建表并插入记录 CREATE TABLE t_number(n INTEGER PRIMARY KEY); INSERT INTO t_number VALUES (0); INSERT INTO t_number VALUES (1); INSERT INTO t_number VALUES (2); INSERT INTO t_number VALUES (3); INSERT INTO t_number VALUES (4); INSERT INTO t_number VALUES (5); INSERT INTO t_number VALUES (6); INSERT INTO t_number VALUES (7); INSERT INTO t_number VALUES (8); INSERT INTO t_number VALUES (9); 实现SQL: SELECT hundred.n * 100 + ten.n * 10 + one.n AS n FROM t_number hundred CROSS JOIN t_number ten CROSS JOIN t_number one ORDER BY n 执行结果: 查询返回了一个0~999的数字序列 。 显然,我们可以通过更多的自连接生成更大的数字序列 。 还有其他生成序列的方法: 例如connect by结合rownum实现 select rownum from dual connect by rownum<=10; 使用level实现 select level from dual connect by level<=10; Oracle表的连接(交叉连接 ,内连接,自然连接,外连接,全外连接)核心:交叉连接select A.column1,A.column2,B.column1,B.column2 from A cross join B; 交叉连接就是做笛卡尔积 计算 原理如下 具体原理百度 解读示例: A表有2行数据 , B表有3行数据 交叉连接后,产生一个新表 C 。
表C左边为 A表数据, 右边为B表数据 。 一共产生6行数据(2*3=6) 。其实就是排列组合 。 内连接在表C中 根据on 关键字后的条件 找行数据,然后 显示出来,显示的列就是select后的指定列; 特殊点:on 的两个判断列 名字可以不同 类型大致相同 select A.column1,A.column2,B.column1,B.column2 from A inner join B on A.column1=B.column1 在C表中找 到
自然连接就是一种内连接 select A.column1,A.column2,B.column1,B.column2 from A natural join B 特殊在于: 1、省略了 on 语句 (条件语句) 系统会自动找 判断列 2、表A和表2中 至少有各自有一列 作为判断列,名称相同,类型大致相同() 外连接(左外 右外)先根据on 语句的条件 进行内连接 得到一个结果,然后在结果的基础上 ,添加行,把A侧没有显示的 行数据,显示出来,B侧 显示为NULL; 全外连接此连接 先根据on 语句的条件 进行内连接 得到一个结果,然后在结果的基础上,添加行,把A侧没有显示的 行数据,显示出来,B侧 显示为NULL; 把B侧没有显示的 行数据,显示出来,A侧 显示为NULL; 感兴趣的 可以自己做几个例子写一写 on 后面 可以用大于 小于 等于做判断 总结以上为个人经验,希望能给大家一个参考,也希望大家多多支持 。 |