當前位置:首頁 » 編程語言 » sql存儲過程遞歸
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql存儲過程遞歸

發布時間: 2022-04-24 22:45:09

A. sql server 2008 存儲過程遞歸層數還是32層么

您好,很高興為您解答。

可以修改,32層已經明顯存在問題了。就算不報錯,也不應該有那麼復雜的邏輯。優化器會處理得很吃力的。

如若滿意,請點擊右側【採納答案】,如若還有問題,請點擊【追問】

希望我的回答對您有所幫助,望採納!

~ O(∩_∩)O~

B. sql語句中怎麼實現遞歸查詢

在SQL
SERVER
2000
中你可以先一些自定義函數,或一些存儲過程,實現遞歸:
select
level,TypeName
from
ProctType
t
START
WITH
t.ParentID=0
CONNECT
BY
PRIOR
t.ProctTypeID=
t.ParentID;

C. 如何實現SQL語句的遞歸查詢

1.創建測試表,createtabletest_connect(idnumber,p_idnumber);

D. sql 知道父節點,查詢所有的子節點,運用游標,遞歸,存儲過程

呃,因為我不清楚你的表裡,這個BPROD
char(15)
老爸
裡面記錄的值是不是和BMWHS
對應的,所以只能說個大概。
select
sys_connect_by_path(username,'>')
"Path"
from
tmbm
start
with
id=1
connect
by
prior
id=parentid;
其中,id是你要遍歷的起始點,比如你想從
廠號=XX
的這個父節點開始尋找他所有的子節點,這里就換成
start
with
BMWHS=XX
然後,connect
by
prior
id=parentid,這里id=parentid,簡單解釋就是尋找其他記錄里,parentid和我的id相同的記錄,也就是找子節點。
應該是換成你的BMWHS=BPROD(我不知道你的BPROD
BCHLD
和哪個屬性是對應的,是BMWHS嗎?)
如果是的話就是下面這樣(username是你要返回的值,假設你還是要返回
BSEQ
序號)
select
sys_connect_by_path(BSEQ,'>')
"Path"
from
tmbm
start
with
BMWHS=XX
connect
by
prior
BMWHS=BPROD;

E. sql觸發器 遞歸 問題

觸發器有兩種不同的遞歸方式,直接遞歸和間接遞歸。

1.直接遞歸

當觸發器被激活並執行一個操作時,該操作又使用同一個觸發器再次執行操作,被稱為直接遞歸。

例利用觸發器的直接遞歸,當在表中刪除一條記錄時,通過觸發器刪除表中所有編號相同的記錄。

2.間接遞歸

更改表1中的數據時,觸發器被激活並執行一個操作,而該操作又使另一個表2中的某個觸發器被激活。表2中的這個觸發器使表1得到更新,從而再次激活表1中的觸發器,被稱為間接遞歸。

例如,一應用程序更新了表TA,並引發觸發器Trigger_A。Trigger_A更新表TB,從而使觸發器Trigger_B被引發。Trigger_B轉而更新表TA,從而使Trigger_A再次被引發間接遞歸。

可以利用系統存儲過程sp_dboption關閉直接遞歸,但這又會開啟間接遞歸。若要把這兩種類型的遞歸都禁止,需要使用系統存儲過程sp_configure。
參考資料:明日系列編程詞典--SQL Server 編程詞典體驗版

F. sql server 遞歸查詢

create table tb(id varchar(3) , pid varchar(3) , name varchar(10));
insert into tb values('001' , null , '廣東省');
insert into tb values('002' , '001' , '廣州市');
insert into tb values('003' , '001' , '深圳市') ;
insert into tb values('004' , '002' , '天河區') ;
insert into tb values('005' , '003' , '羅湖區');
insert into tb values('006' , '003' , '福田區') ;
insert into tb values('007' , '003' , '寶安區') ;
insert into tb values('008' , '007' , '西鄉鎮') ;
insert into tb values('009' , '007' , '龍華鎮');
insert into tb values('010' , '007' , '松崗鎮')WITH EmpsCTE AS
(
SELECT EmployeeID, ReportsTo, FirstName, LastName
FROM dbo.Employees
WHERE EmployeeID = 5

UNION ALL

SELECT EMP.EmployeeID, EMP.ReportsTo, EMP.FirstName, EMP.LastName
FROM EmpsCTE AS MGR
JOIN dbo.Employees AS EMP
ON EMP.ReportsTo = MGR.EmployeeID
)
SELECT * FROM EmpsCTE;

這就是一個使用CTE的一個查詢,你看一下吧

G. 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;

H. 如何使用sql語句建立一個存儲過程來實現如下遞歸功能

這個是遞歸載入樹,我原來做是用兩個過程來實現的,不知道能不能達到你的要求,如果要,給個郵箱,我發給你。

I. 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;

J. 在SQL Server的存儲過程里如何使用遞歸

--樹型結構處理之雙編號(廣度深度排序)
if OBJECTPROPERTY(object_id('tb'),'isusertable')<>0
drop table tb
create table tb(ybh nvarchar(10),ebh nvarchar(10),beizhu nvarchar(1000))
insert tb
select '0001',null,'雲南省'
union all select '0002','0001','昆明市'
union all select '0003','0001','昭通市'
union all select '0009','0001','大理市'
union all select '0008',null,'四川省'
union all select '0004',null,'貴州省'
union all select '0005','0002','五華區'
union all select '0007','0002','水富縣'
union all select '0006','0005','西園路192號'
union all select '0010','0006','金色梧桐3-702'
union all select '0011','0010','昆明越科時空科技有限公司'
union all select '0015','0007','兩碗鄉'
union all select '0013','0015','兩碗村'
union all select '0012','0013','某跨國集團董事長'
union all select '0014','0008','成都市'

--深度排序(模擬單編碼法)
declare @level_tt table(ybh nvarchar(1000),ebh nvarchar(1000),level int)
declare @level int
set @level=0
insert @level_tt(ybh,ebh,level)
select ybh,ybh,@level from tb where ebh is null
while @@ROWCOUNT>0
begin
set @level=@level+1
insert @level_tt(ybh,ebh,level)
select a.ybh,b.ebh+a.ybh,@level
from tb a,@level_tt b
where a.ebh=b.ybh and b.level=@level-1
end
select space(b.level*2)+'----'+a.beizhu,a.*,b.*
from tb a,@level_tt b
where a.ybh=b.ybh
order by b.ebh
/*
(結果) ybh ebh beizhu ybh ebh level
----雲南省 0001 NULL 雲南省 0001 0001 0
----昆明市 0002 0001 昆明市 0002 00010002 1
----五華區 0005 0002 五華區 0005 000100020005 2
----西園路192號 0006 0005 西園路192號 0006 0001000200050006 3
----金色梧桐3-702 0010 0006 金色梧桐3-702 0010 00010002000500060010 4
----昆明越科時空科技有限公司 0011 0010 昆明越科時空科技有限公司 0011 000100020005000600100011 5
----水富縣 0007 0002 水富縣 0007 000100020007 2
----兩碗鄉 0015 0007 兩碗鄉 0015 0001000200070015 3
----兩碗村 0013 0015 兩碗村 0013 00010002000700150013 4
----某跨國集團董事長 0012 0013 某跨國集團董事長 0012 000100020007001500130012 5
----昭通市 0003 0001 昭通市 0003 00010003 1
----大理市 0009 0001 大理市 0009 00010009 1
----貴州省 0004 NULL 貴州省 0004 0004 0
----四川省 0008 NULL 四川省 0008 0008 0
----成都市 0014 0008 成都市 0014 00080014 1
*/