遞歸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