sql遞歸函數
『壹』 sql語句中怎麼實現遞歸查詢
在SQL
SERVER
2000
中你可以先一些自定義函數,或一些存儲過程,實現遞歸:
select
level,TypeName
from
ProctType
t
START
WITH
t.ParentID=0
CONNECT
BY
PRIOR
t.ProctTypeID=
t.ParentID;
『貳』 SQL怎麼也寫成遞歸形式
函數或過程才可以遞歸。
例如:
/*--=============================================
--Author: Yew
--Createdate:2016-10-26
--Description: 計算階乘
--testCode-------------
SELECTuf_Factorial(-1)
SELECTuf_Factorial(0)
SELECTuf_Factorial(1)
SELECTuf_Factorial(10)
SELECTuf_Factorial(20)--會否溢出?
----History-----------------
--=============================================*/
CREATEFUNCTION[dbo].[uf_Factorial](
@N INT
)RETURNSBIGINT
AS
BEGIN
IF@N<0
RETURNNULL--RAISERROR(N'參數N不能為負')
IF@N=0
RETURN1
RETURNdbo.uf_Facctorial(@N-1)*@N--遞歸
END
『叄』 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語句實現遞歸查詢所有節點,mysql和oracle都能用的
首先說一下Oracle的遞歸查詢,相信大部分人都知道很簡單。無非start with connect by 函數。下面是從pId向子節點遞歸查詢的例子,unId是資料庫表中的主鍵。
如果是從子節點遞歸到父節點查詢,就把start with 換成unid,prior左右對換
下面再講MySql 的遞歸查詢方式。MySql沒有Oracle的強大功能,雖然都是同一個公司的產品。所以只能靠自己寫。有很多方法,用sql去循環查詢,或者寫存儲過程,我這里只提供一種。就是新建一個function函數。
表結構不說了,無非就是 Id ,pId,其他列。下面是創建一個遞歸查詢子節點的函數
DROP FUNCTION IF EXISTS queryChildrenPowerInfo;
CREATE FUNCTION `queryChildrenPowerInfo` (powerId VARCHAR(2000))
RETURNS VARCHAR(2000)
BEGIN
DECLARE sTemp VARCHAR(2000);
DECLARE sTempChd VARCHAR(2000);
SET sTemp = '$';
SET sTempChd = cast(powerId as CHAR);
WHILE sTempChd is not NULL DO
SET sTemp = CONCAT(sTemp, ',', sTempChd);
SELECT group_concat(id) INTO sTempChd FROM t_discretionary_power where FIND_IN_SET(pId,sTempChd)>0;
END WHILE;
return sTemp;
調用的時候:select queryChildrenPowerInfo(""); 該語句會返回Id和父Id等於傳入參數powerId的一個字元串,中間有逗號隔開如圖
下面這句代碼的意思是,查詢出 t_discretionary_power 表中,t.id 等於上面查詢出的結果集的數據。FIND_IN_SET(A,B)是MYSQL的函數。意思是查找在B集合中有A的數據。相當於In
select t.* from t_discretionary_power t where FIND_IN_SET(t.id,queryChildrenPowerInfo(''))
『伍』 SQL怎麼用遞歸函數取到最上層的數據
execproc_getDepartment'A'
GO
ALTERPROCEDUREproc_getDepartment
@departmentnvarchar(20)
AS
BEGIN
DECLARE@upDepartmentnvarchar(20)
SELECTTOP(1)@upDepartment=a.上級部門FROMTBASa
WHEREa.部門=@department
IFEXISTS(SELECT1FROMTBASa
WHEREa.部門=@upDepartment)
BEGIN
execproc_getDepartment@upDepartment
RETURN
END
PRINT@upDepartment
END
GO
『陸』 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遞歸獲取所有父節點的函數
*************
函數如下,請根據你自己的實際情況,把漢字換成相應的具體信息
*************
CREATEFUNCTION函數名(@idASvarchar(2))RETURNSvarchar(1000)AS
BEGIN
DECLARE@tmpVARCHAR(1000)
IF@idISNOTNULL
BEGIN
SELECT@tmp=@id+','+isnull(dbo.函數名(第三列欄位),'')FROM[表名]WHERE[第一列欄位]=@id
RETURN@tmp
***********
調用方法:
***********
SELECTsubstring(dbo.函數名('15'),1,len(dbo.函數名('15'))-1)
**********
給你個我測試的截圖,參考
**********
---
以上,希望對你有所幫助。
『捌』 SQL函數怎麼實現遞歸
declare @b nvarchar(2) =1;
with abc(id,b_PriorID,level)as
(
select id,b_PriorID,0 level from #tt where b_PriorID =@b
union all
select a.id,a.b_PriorID,t.level+1 from #tt a
inner join abc t
on t.id=a.b_PriorID
)
select * from abc
你試試可以么?
『玖』 如何實現SQL語句的遞歸查詢
1.創建測試表,createtabletest_connect(idnumber,p_idnumber);
『拾』 sql 怎麼遞歸查詢的方法:
1.創建測試表,createtabletest_connect(idnumber,p_idnumber);