其他分享
首页 > 其他分享> > 【笔记】Cross Join&lag与lead函数

【笔记】Cross Join&lag与lead函数

作者:互联网

Oracle Cross Join交叉连接 语法

CROSS JOIN 指定第一个表的所有行与第二个表的所有行连接。如果 table1 中有“x”行,table2 中有“y”行,则交叉连接结果集有 x*y 行。当没有指定匹配的连接列时,通常会发生这种情况。

简单来说,可以说如果连接查询中的两个表没有连接条件,那么 Oracle 将返回它们的笛卡尔积。

语法:

SELECT * FROM table1
CROSS JOIN table2;
或者:
SELECT * FROM table1, table2

lag与lead函数

lag与lead函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤

lead(field, num, defaultvalue) field需要查找的字段
num往后查找的num行的数据,defaultvalue没有符合条件的默认值
lag(field, num, defaultvalue)与lead(field, num, defaultvalue)刚好相反
是往前查找num行的数据。

lead(value_expr [,offset][,default]) over([query_partition_clause] order by Order_by_clause)

参数说明:

value_expr 值表达式,通常是字段,也可是是表达式。value_expr本身不支持分析函数,也就是lead不支持多层调用
offset 偏移,应该是很熟悉的数学概念了,或者是相对偏移,表格来开当前行的第offset行,如果offset是整数就表示是顺序下的前第n行,如果是负数就是往后第n行。 如果不提供这个参数,就是默认为1.
default 默认值,如果没有找到,应该返回什么值的意思,有点类似nvl(col,value)。如果没有设置,且找不到,那么就返回Null
over 理解成在一个结果集范围内,如果后面的partition by为空,那么就是当前的结果集范围内。
query_partition_clause 分区语句,对结果集合分区的语句,是可选的,如果没有就是所有的一个分区。
Order_by_clause 排序语句 必须需要 ,形如order by xxx desc/asc

--交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换
首先使用decode判断当前行id是奇数还是偶数,
如果是奇数用lead函数往下一行偏移查数据,
如果是偶数用lag函数往上一行偏移查数据。
lead(field, num, defaultvalue) field需要查找的字段
num往后查找的num行的数据,defaultvalue没有符合条件的默认值。
lag(field, num, defaultvalue)与lead(field, num, defaultvalue)刚好相反
是往前查找num行的数据。
select id,
decode(mod(id,2), 1, lead(student, 1, student) over(order by id), lag(student, 1) over(order by id)) as student
from seat

标签:Join,lead,defaultvalue,lag,field,num,id
来源: https://www.cnblogs.com/jokingremarks/p/16622458.html