⑴ 遞歸sql語句
CREATETABLE#test(
Achar(1),
Bchar(1)
)
GO
INSERTINTO#testVALUES('a','b');
INSERTINTO#testVALUES('b','c');
INSERTINTO#testVALUES('c','d');
INSERTINTO#testVALUES('d','e');
INSERTINTO#testVALUES('e','f');
INSERTINTO#testVALUES('a','g');
INSERTINTO#testVALUES('a','h');
INSERTINTO#testVALUES('g','m');
INSERTINTO#testVALUES('m','n');
GO
WithmyCTEAS
(
SELECT
0ASLevel,A,B
FROM
#test
WHERE
B='e'
UNIONALL
SELECT
myCTE.Level+1ASLevel,
t.A,t.B
FROM
#testtJOINmyCTEON(myCTE.A=t.B)
)
SELECTtop1
AAS[最高父節點]
FROM
myCTE
ORDERBY
LevelDESC
GO
最高父節點
-----
a
(1行受影響)
WithmyCTEAS
(
SELECT
0ASLevel,A,B
FROM
#test
WHERE
B='e'
UNIONALL
SELECT
myCTE.Level+1ASLevel,
t.A,t.B
FROM
#testtJOINmyCTEON(myCTE.B=t.A)
)
SELECTtop1
BAS[最下面子節點]
FROM
myCTE
ORDERBY
LevelDESC
GO
最下面子節點
------
f
(1行受影響)
SQL Server 2008 Express 版本下測試通過。
⑵ SQL遞歸(高分,急).
這個估計PKId是ParentId的父節點吧
給你舉個例子,就只用這兩個欄位吧,其他的也沒多大用
PKId ParentId
1 0
2 0
3 1
4 2
5 1
假設數據是我上邊這樣的
可以假設每個PKId分別為商品大類,就把1的定義為軟體吧,2定義為硬體,3為硬碟,4為ps軟體,5為主板
這樣的話,你就能看出對應關系了吧?
1和2是最高層的,所以無父節點,所以ParentId為0
3和5都是硬體,所以歸屬為1
4為軟體,所以歸屬為2
這樣的好處是減少多次讀取其他表裡的無用信息,在一定程度上可以提高效率,當然是指數據量大的時候,數據量小的時候基本沒什麼區別
作用你自己都說了,其實就是實現自我關聯
但是這樣有一點不好,在自身有主鍵外鍵,如果其中的邏輯關系弄的不太清楚的話,很容易出問題,簡單來說就是這樣了
⑶ sql存儲過程用遞歸
表結構:
sale_area銷售分區表
PK#area_id
class_id
gonghao
prod_class產品分類表
PK#class_id
class_name
問題sql語句:
select distinct pa.class_id from prod_class As pa,prod_class As pb,sale_area where pb.class_id in(select sale_area.class_id from sale_area where sale_area.gonghao=<param>) and pa.class_id like pb.class_id||'%'
問題定義:
根據傳入的參數gonghao來確定對應的class_id集,然後遍歷這個class_id集,並「擴充」這個集合
要理解「擴充」必須知道class_id是這樣設等級:
0為最高級
|_01
| |_011
| |_012
|_02
|_011
|_012
那麼擁有等級0的話,所有的等級都應該可以訪問,擁有等級01的話,011、012也可以訪問。
這句sql的目的就是得到當前員工能訪問的所有產品分類及它的子集。
通過自連接的做法在Oracle里是對的,在DB2里就錯,原因在於DB2中謂詞like兩邊至少有一個是字元串,也就是說DB2不認為pb.class_id||'%'是字元串。
求解:
要完成上面的任務有什麼可替代的辦法或改進的地方,注意環境是DB2 UDB 7.2。
---------------------------------------------------------------
就是樹的問題。
使用公共表達式可以完成。
你在信息中心裏面按recusion去搜索,可以找到遞歸sql的寫法。
---------------------------------------------------------------
問題寫的很清楚,我喜歡!
如果要使用DB2的公共表達式建議你把
prod_class產品分類表結構改一下
PK#class_id
class_name
Parent_Class_id
sql語句如下:
with temp_class_id( class_id,class_name)
(
select pc.class_id,pc.class_name from prod_class pc
where pc.class_id in (select sale_area.class_id from sale_area
where sale_area.gonghao=<param>)
union
select pc.class_id,pc.class_name from prod_class pc,
temp_class_id tc
where pc.parent_id = tc.class_id)
select * from temp_class_id;
⑷ 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
⑸ 無限遞歸sql語句
create table testtab (id int, typeid int);
insert into testtab values(0,1), (1,2),(1,3),(2,4),(3,5),(4,6);
with iter (id, typeid) as (
select id, typeid from testtab
union all
select t.id, t.typeid from iter, testtab t where iter.typeid = t.id
)
select distinct id, typeid from iter;
大致是這樣
⑹ SQL遞歸查詢知多少
sql 遞歸查詢的方法:
方法一:T-SQL遞歸查詢
with Dep as
(
select Id,DeptCode,DeptName from Department where Id=1
union all
select d.Id,d.DeptCode,d.DeptName from Dep
inner join Department d on dep.Id = d.ParentDeptId
)
select * from Dep
方法二:PL/SQL遞歸查詢
select Id,DeptCode,DeptName
from Department
start with Id = 1
connect by prior Id = ParentDeptId;
⑺ sql 怎麼遞歸查詢的方法:
1.創建測試表,createtabletest_connect(idnumber,p_idnumber);
⑻ sql語句中怎麼實現遞歸查詢
在SQL SERVER 2000 中你可以先一些自定義函數,或一些存儲過程,實現遞歸:
select level,TypeName
from ProctType t
START WITH t.ParentID=0
CONNECT BY PRIOR t.ProctTypeID= t.ParentID;
⑼ SQL遞歸操作
這哪裡是遞歸了?
回去好好看看課本什麼叫遞歸再來問