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

sql有條件遞歸

發布時間: 2023-05-18 21:53:26

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用什麼方法可以實現遞歸函數

在 SQL 中,你可以使用遞歸查詢來實現遞歸函數。遞歸查詢是一種查詢,其中結果集由一條或多條 SELECT 語句和察埋一條用於查找敗碧螞下一級行的 UNION ALL 語句組成。
例如,假設你有一張表,其中包含父子關系的信息(即,每個記錄都有一個父級 ID,表示它的父級),你可以使用以下遞歸查詢來查詢每個記錄的慧鄭所有祖先:
WITH RECURSIVE ancestors AS (
-- 初始查詢
SELECT id, parent_id
FROM your_table
WHERE id = :your_id
UNION ALL
-- 遞歸查詢
SELECT t.id, t.parent_id
FROM your_table t
INNER JOIN ancestors a ON t.id = a.parent_id
)
SELECT id FROM ancestors;
在這個查詢中,我們使用了一個遞歸關系,其中第一個 SELECT 語句是初始查詢,用於查詢給定 ID 的記錄。第二個 SELECT 語句是遞歸查詢,用於查詢與當前記錄的父級相關的記錄。通過將這兩個 SELECT 語句用 UNION ALL 連接起來,我們就可以獲得所有祖先的列表了。

❸ sql 怎麼遞歸查詢的方法:

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

❹ 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語句


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存儲過程用遞歸

表結構:
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 PROCEDURE [dbo].[SetColGroup](@sColItemCode VARCHAR(50),@ReportID VARCHAR(50) )
AS
-- 獲取ItemCode對應的GroupCode,並更新至臨時表中
BEGIN

DECLARE @sSQL VARCHAR(1000)
DECLARE @colGroupCode VARCHAR(50)
DECLARE @SuperColItemCode VARCHAR(50)
DECLARE @colSuperGroupCode VARCHAR(50)

--獲取下一級別的數據(這里的SuperColItemCode實際上是下一級數據)
DECLARE curGroupCodeTmp CURSOR LOCAL FOR
SELECT c.ColGroupCode,b.SuperColItemCode,d.ColGroupCode AS ColSuperGroupCode
FROM dbo.ReportItemCross b
INNER JOIN dbo.ReportColItem c ON b.ColItemCode = c.ColItemCode
INNER JOIN dbo.ReportColItem d ON b.SuperColItemCode = d.ColItemCode
WHERE b.ColItemCode = @sColItemCode AND b.ReportID = @ReportID
OPEN curGroupCodeTmp
FETCH NEXT FROM curGroupCodeTmp
INTO @colGroupCode,@SuperColItemCode,@colSuperGroupCode
WHILE @@FETCH_STATUS = 0
BEGIN
--此處進行實際數據處理
IF(ISNULL(@colGroupCode,'')<>'' AND ISNULL(@colSuperGroupCode,'')<>'')
SET @sSQL = 'update ##tmp set ' + @colSuperGroupCode + ' = ''' + @SuperColItemCode
+ ''' where ' + @colGroupCode + ' = ''' + @sColItemCode + ''''
EXECUTE(@sSQL)
--根據條件判斷是否結束遞歸
IF(ISNULL(@SuperColItemCode,'') <> '')
EXEC SetColGroup @SuperColItemCode,@ReportID
FETCH NEXT FROM curGroupCodeTmp
INTO @colGroupCode,@SuperColItemCode,@colSuperGroupCode
END

CLOSE curGroupCodeTmp
DEALLOCATE curGroupCodeTmp

END

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

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