oracle层次查询-查询每个学生所选择的课程列表(同一行显示)
来源:互联网 发布:大数据技术具体应用 编辑:程序博客网 时间:2024/03/29 06:08
还拿学生课程表来说明如下,表结构如下:
create table T_STU( id NUMBER not null, name VARCHAR2(255))create table T_COURSE( id NUMBER not null, coursename VARCHAR2(255))create table T_S_C( sid NUMBER, cid NUMBER, course NUMBER)
数据如下:
经过关联之后,如下:
需求为达到以下效果
即显示每个学生选择的课程列表,在同一行显示。
所以sql为以下:
with tab1 as (select s.id,s.name,c.coursename,sc.coursefrom t_stu s,t_course c,t_s_c scwhere s.id=sc.sid and c.id=sc.cid)select z.name, level lv, SYS_CONNECT_BY_PATH(z.coursename, '/') text, CONNECT_BY_ROOT (z.coursename) root from (select t.*,Row_number() OVER (PARTITION BY id ORDER BY id) rfrom tab1 t ) z where connect_by_isleaf = 1 start with r = 1 connect by r - 1 = prior r and id = prior id
效果如下:
说明:
1、Row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
select t.* ,ROW_NUMBER() OVER(ORDER BY sid) x from t_s_c t
select t.* ,ROW_NUMBER() OVER(PARTITION BY t.sid ORDER BY t.course) x from t_s_c t
2、with table as [,table2 as]
相当于建个临时表(用于一个语句中某些中间结果放在临时表空间的SQL语句),Oracle 9i 新增WITH语法,可以将查询中的子查询命名,放到SELECT语句的最前面。
with tab1 as
(select * from t_s_c where course >=80)
select * from tab1
3、connect by
重点函数:sys_connect_by_path(z.coursename, '/')
z.coursename表示要连接的字段,‘/’表示连接符
使用这个方法之前必须在where条件中构建树
where start with 条件1 connect by prior 条件2
条件1 :表示起始条件,例如,起始条件为组内排序后的rownum为1
条件2 :表示要连接的下一行与上一行的关系
prior.列名:代表上一行的列
Level是层次查询的一个伪列,即深度
SYS_CONNECT_BY_PATH :实现将从父节点到当前行内容以“path”或者层次元素列表的形式显示出来
CONNECT_BY_ROOT: 它用在列名之前用于返回当前层的根节点
CONNECT_BY_ISCYCLE 查询叶子节点为1,如果:
Start with确定将哪些行作为root,如果没有start with,则每行都当作root,然后查找其后代。如图:
- oracle层次查询-查询每个学生所选择的课程列表(同一行显示)
- 学生成绩同一行显示或者课程安排按照一周星期的显示
- [SQL]学生、课程、选课,查询选择所有/3门以上课程的学生
- oracle查询学生选择课
- oracle的层次查询
- oracle的层次查询
- SQL语句查询指定的数据,查询只选择了指定4门课程的学生
- 查询每个学生都选修了且分数全部大于70分的课程
- oracle层次查询的陷阱
- SQL 基础题1 +查询选择了课程1的学生 +2:同时选择2门课的学生。
- SQL学习(5)查询选修全部课程的学生
- EXCEL 查询附合条件的记录,并显示同一行的其它值
- Oracle树形查询 ,结果显示一行
- 在同一行中显示查询出来的多个记录
- oracle查询表空间大小以及每个表所占空间的大小
- oracle层次查询
- Oracle 层次查询
- ORACLE层次化查询
- ubuntu中vsftpd虚拟用户实现不同用户不同权限
- x2检验(chi-square test)或称卡方检验
- android 随手记 videoview循环播放网络视频 和mediaplayer+sufaceview播放网络视频
- 关于图像识别与人工智能的就业情况
- unity3d学习笔记(七)--利用单例脚本实现英雄与怪物的攻击与受击
- oracle层次查询-查询每个学生所选择的课程列表(同一行显示)
- linux配置tomcat开机自启动
- vs2010+svn
- 想了解的模型基础东东
- OSI七层网络模型,TCP/IP四层网络模型与网络协议解析
- 用Mixer API函数调节控制面板的音频设置
- MediaPlayer设置StreamType需要在prepare之前
- c语言对一组数据随机排序
- MongoDB 备份与恢复的实践