递归sql语句
❶ sql 怎么递归查询的方法:
1.创建测试表,createtabletest_connect(idnumber,p_idnumber);
❷ 递归SQL语句、索引的HEIGHT和BLEVEL以及SELECT FOR UPDATE相关问题
1,所谓的递归sql就是在运行当前的sql时调用另外一个sql,如果另外一个sql又调用了另一个sql,那么递归深度就是1(从0开始)。
2,unique scan一般出现在扫描具有unique约束的索引列上:
scott@ORCL>select * from emp where empno=7788;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7788 TEST ANALYST 7566 09-12月-83 10000 20
执行计划
----------------------------------------------------------
Plan hash value: 1181765974
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 37 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 37 | 1 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | EMP_EMPNO_IDX | 1 | | 0 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
因为CBO知道这个索引是唯一的,所以确裤瞎定在扫描时只会返回一个rowid。
而range scan一般是扫描非唯一索引时,原理同上含旦,不再赘述。
3,scott@ORCL>analyze index emp_empno_idx validate structure;
索引已分析
scott@ORCL>select HEIGHT from index_stats;
HEIGHT
----------
1
scott@ORCL>select blevel from user_indexes where index_name='EMP_EMPNO_IDX'谈纯扰;
BLEVEL
----------
0
另外平衡树的索引结构如下:
1
/\
/ \
2 3
/ \
4 5
height也就是索引的高度,这里是3。
而blevel指的是从根遍历到当前块要走的路径长度,比如:2,3的blevel为1;4,5的为2,根本身的blevel为0
而在user_indexes中的blevel字段值正是上面值的最大值,通常等于树的高度,即height值:
下面是实例说明:
scott@ORCL>create table test as select * from sys.SOURCE$;
表已创建。
scott@ORCL>desc test
名称
-----------------------------------------------------------------------------------------------------
OBJ#
LINE
SOURCE
scott@ORCL>create index test_idx on test(obj#);
索引已创建。
scott@ORCL>analyze index test_idx validate structure;
索引已分析
scott@ORCL>select blevel from all_indexes where lower(index_name)='test_idx';
BLEVEL
----------
2
4,当然可行,因为这时其它行是没有被锁定的。
scott@ORCL>select * from emp where deptno=10 for update;
sys@ORCL>delete from scott.emp where deptno!=10;
已删除11行。
其实有的问题只要自己动手实践一下就行了,另外树高度为三级的索引是非常罕见的,除非你的表是非常的巨大。
❸ SQL 函数递归
给你一个例子,跟这个差不多:
CREATE TABLE T(ID INT ,PID INT)
INSERT INTO T SELECT 1,0
UNION ALL SELECT 2,0
UNION ALL SELECT 3,1
UNION ALL SELECT 4,1
UNION ALL SELECT 5,2
UNION ALL SELECT 6,4
UNION ALL SELECT 7,3
UNION ALL SELECT 8,4
GO
--测试数据
CREATE FUNCTION F(@ID INT)
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @R VARCHAR(20)
SET @R=@ID
WHILE ISNULL(@ID,'')<>''
BEGIN
SELECT @R=CAST(PID AS VARCHAR(20))+'.'+@R FROM T WHERE ID=@ID
SELECT @ID=PID FROM T WHERE ID=@ID
END
RETURN @R
END
GO
--生成目录
CREATE FUNCTION F2(@F VARCHAR(20))
RETURNS VARCHAR(20)
BEGIN
DECLARE @R VARCHAR(20)
SET @R=''
SET @F=SUBSTRING(@F,4,LEN(@F))
WHILE CHARINDEX('.',@F,1)<>0
BEGIN
SET @F=SUBSTRING(@F,CHARINDEX('.',@F,1)+1,LEN(@F))
SET @R='-'+@R
END
RETURN @R
END
GO
--生成前缀符号
SELECT DBO.F2(DBO.F(ID))+CAST(ID AS VARCHAR) FROM T ORDER BY DBO.F(ID)
GO
--结果
DROP TABLE T
DROP FUNCTION F
DROP FUNCTION F2
----------------------------------------------------以下为结果集--------------------------------------------------------------
1
-3
--7
-4
--6
--8
2
-5