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

sql樹狀遞歸查詢

發布時間: 2023-05-22 13:28:09

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 2000 遞歸查詢

with tt(select 語句1 --初始化
union all
select 語句2)
select * from tt
在select 語句2中from的表裡關聯with後面的表名tt就形成遞推了。

Ⅲ Linq To Sql 如何實現遞歸查詢 樹形結構

--構造測試數據: 只作演示用
CREATE TABLE [dbo].[Tim_LinqTable](
[Id] int PRIMARY KEY IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
[Parent] int NOT NULL,
)
GO

INSERT INTO [Tim_LinqTable]
SELECT 'A',0 UNION ALL
SELECT 'A1',1 UNION ALL
SELECT 'A2',1 UNION ALL
SELECT 'B1',2 UNION ALL
SELECT 'B2',3 UNION ALL
SELECT 'C1',4 UNION ALL
SELECT 'C2',4 UNION ALL
SELECT 'D1',5 UNION ALL
SELECT 'D2',5 UNION ALL
SELECT 'D3',5
GO

WITH temp
AS
(
SELECT * FROM [Tim_LinqTable] WHERE Parent = 3
UNION ALL
SELECT m.* FROM [Tim_LinqTable] AS m
INNER JOIN temp AS child ON m.Parent = child.Id
)
SELECT * FROM temp
GO

--查詢 Parent=3 的所有子數據結果如下罩鬧:
Id Name Parent
----------- -------------------------------------------------- -----------
5 B2 3
8 D1 5
9 D2 5
10 D3 5

(4 row(s) affected)

//好中鍵,下物培罩邊來看看用C#怎麼實現上邊的SQL語句吧:
void Main()
{
var query=GetClassID(3);
Console.WriteLine("Id\tName\tParent");
query.ToList().ForEach(q=>Console.WriteLine("{0}\t{1}\t{2}",q.Id,q.Name,q.Parent));
/*
Id Name Parent
5 B2 3
8 D1 5
9 D2 5
10 D3 5
*/
}
public IEnumerable<Tim_LinqTable> GetClassID(int p_id)
{
var query = from c in this.Tim_LinqTables
where c.Parent == p_id
select c;

return query.ToList().Concat(query.ToList().SelectMany(t => GetClassID(t.Id)));
}

Ⅳ SQL樹形層級查詢

你好的!
oracle 的start with connect by
別的資料庫用cte 遞歸都能達到你要的效果!
望採納~

Ⅳ sql 樹形結構遞歸查詢問題 求助求助求助

簡單示例
createtableTree
(
IDintidentity(1,1)primarykeynotnull,
Namevarchar(20)notnull,
Parentvarchar(20)null
)
go
insertTreevalues('大學',null)
insertTreevalues('學院','大學')
insertTreevalues('計算機學院','學院')前芹
insertTreevalues('網路工程','計算機學襲行院')
insertTreevalues('信息管理','計算機學院')
insertTreevalues('電信學院','學院')
insertTreevalues('教務處','大學')
insertTreevalues('材料科','教務處')
insertTreevalues('招生辦','大學')
go
withCTEas
(
-->Begin一個定位點成員
selectID,Name,Parent,cast(Nameasnvarchar(max))asTE,
-->End
unionall
-->Begin一個遞歸成員
selectTree.ID,Tree.Name,Tree.Parent,cast(replicate('',len(CTE.TE))+'|_'+Tree.nameasnvarchar(MAX))asTE,Levle+1asLevle
慧禪畢fromTreeinnerjoinCTE
onTree.Parent=CTE.Name
-->End
)
select*fromCTEorderbyID

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

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

Ⅶ 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(''))