SQL递归语句

 

 

USE [WPF]
GO
/****** Object:  Table [dbo].[C_TREEVIEW]    Script Date: 2019/10/7 12:48:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[C_TREEVIEW](
    [GUID] [nchar](36) NULL,
    [ID] [int] NULL,
    [NAME] [nvarchar](100) NULL,
    [PID] [int] NULL
) ON [PRIMARY]

GO
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'05f2c76c-6b43-4577-b72d-94669def2958', 0, N'根节点', -1)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'a308d38b-8d96-45ff-b7d3-978ecacb1419', 1, N'爷爷', 0)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'9b5f060a-ff40-4273-8c3d-a9c37056dcf5', 2, N'爸爸', 1)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'3a55b881-b6c7-4682-8d59-639a77066227', 3, N'大姑', 1)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'e27e364a-d28d-4607-b500-4522228775d6', 4, N'二姑', 1)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'9a2b4580-cc1e-49a9-98c8-2c7ede13091a', 5, N'三姑', 1)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'760e1af8-4962-464f-85bf-62ab817096ed', 6, N'姐姐', 2)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'f31f3456-77ff-44ee-9b0e-be788828ef22', 21, N'姜彦', 2)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'27868be6-b1fa-48c3-a8e9-8696fb65ef0a', 8, N'妹妹', 2)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'5d10b662-a87f-45e0-ba83-dbce90d31d83', 9, N'周鑫', 3)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'f835120a-2441-4b8e-a2ab-dd8f23accc2e', 10, N'慧丽', 3)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'b13fcf04-e920-4256-bfa8-b670821fcf5e', 11, N'志浩', 5)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'b917a081-9468-49c4-a27b-02e6685f9125', 12, N'夏慧', 4)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'1f242652-dd75-4cba-8081-8c3b23e492d0', 13, N'腾腾', 7)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'a1ca43a9-8742-44bd-ad7d-dcb595597c90', 14, N'睿聪', 6)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'ae9e82aa-8a6a-4054-8320-28f7c95e707f', 15, N'凌睿', 6)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'fa673193-46e0-4835-9763-29467537bddd', 16, N'蓬蓬', 8)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'a7e3974b-e663-44f2-b3fa-f7f4dd797bd3', 17, N'周鑫儿子', 9)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'3656c2a4-06b1-4256-89f7-75b4c6dcf0fd', 18, N'慧丽儿子', 10)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'7d51726f-4ccc-45d9-88db-3c88124a94e7', 19, N'夏慧儿子', 12)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'809794a5-0b51-4407-8740-6585d746f2a3', 20, N'志浩女儿', 11)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'aee1b0c4-a156-492b-92fb-453c96834e0c', 22, N'腾腾', 21)
INSERT [dbo].[C_TREEVIEW] ([GUID], [ID], [NAME], [PID]) VALUES (N'fbe4c4ed-170c-4229-b6e8-ba6a0fa280d3', 23, N'苏苏', 21)

 

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT *
  FROM [WPF].[dbo].[C_TREEVIEW]

UPDATE [WPF].[dbo].[C_TREEVIEW] SET PID=-1
WHERE ID=0


--1.递归有效语句1
with ts as 
(
  select ID,NAME,PID from [WPF].[dbo].[C_TREEVIEW] where  ID=2 and PID=1 --首先要查询出最原始父级的信息
  union all     --全连接
  select a.ID, a.NAME,a.PID from [WPF].[dbo].[C_TREEVIEW] a inner join ts b on a.PID=b.ID
    --将整体的查询结果重新嵌套进语句中,将查询结果集中子类的ID与父类ID关联,进行查询
)
  select * from ts  order by ID

  --2.递归有效语句 2
with subqry(ID,NAME,PID) as 
(
  select ID,NAME,PID from [WPF].[dbo].[C_TREEVIEW] where ID = 2 --指定id
  union all
  select [WPF].[dbo].[C_TREEVIEW].ID,[WPF].[dbo].[C_TREEVIEW].NAME,[WPF].[dbo].[C_TREEVIEW].PID from [WPF].[dbo].[C_TREEVIEW],subqry where [WPF].[dbo].[C_TREEVIEW].PID = subqry.ID
)
select* from subqry

 --3.递归有效语句 3
WITH  Emp   AS 
( 
    SELECT * FROM  [WPF].[dbo].[C_TREEVIEW] WHERE    ID = 0  --首先要查询的父节点信息          
    UNION ALL   --全连接               
    SELECT   d.*  FROM Emp INNER JOIN [WPF].[dbo].[C_TREEVIEW] d ON d.PID= Emp.ID     
)                     
SELECT *   FROM    Emp  OPTION (MAXRECURSION 0);-- OPTION (MAXRECURSION 0);递归级数 0表示无限级,1:一层;2:两层...

--4.递归有效语句 4
--https://so.m.sm.cn/c/www.360doc.cn/mip/373486751.html
with my1 as
(
    select * from [WPF].[dbo].[C_TREEVIEW] where ID = 21
    union all 
    select [WPF].[dbo].[C_TREEVIEW].* from my1, [WPF].[dbo].[C_TREEVIEW] where my1.ID = [WPF].[dbo].[C_TREEVIEW].PID
)
select * from my1 
where my1.ID<>21--结果包含21这条记录,如果不想包含,可以在最后加上:where id <> 21

--5.递归删除语句有点问题版本 删除了 仅当前节点+仅其父节点 共计2条数据
with my1 as
(
    select * from [WPF].[dbo].[C_TREEVIEW] where ID = 24
    union all 
    select [WPF].[dbo].[C_TREEVIEW].* from my1, [WPF].[dbo].[C_TREEVIEW] where my1.ID = [WPF].[dbo].[C_TREEVIEW].PID
)
delete from [WPF].[dbo].[C_TREEVIEW] 
where exists (select ID from my1 where my1.PID = [WPF].[dbo].[C_TREEVIEW].ID)


SELECT *
  FROM [WPF].[dbo].[C_TREEVIEW]

--3.递归有效语句 3
WITH  Emp   AS 
( 
    SELECT * FROM  [WPF].[dbo].[C_TREEVIEW] WHERE    ID = 21  --首先要查询的父节点信息          
    UNION ALL   --全连接               
    SELECT   d.*  FROM Emp INNER JOIN [WPF].[dbo].[C_TREEVIEW] d ON d.PID= Emp.ID     
)                     
SELECT *   FROM    Emp  OPTION (MAXRECURSION 0);-- OPTION (MAXRECURSION 0);递归级数 0表示无限级,1:一层;2:两层...

--6.递归删除语句 删除该节点下面所有的子节点(不删除当前节点)
with my1 as
(
    select * from [WPF].[dbo].[C_TREEVIEW] where ID = 24
    union all 
    select [WPF].[dbo].[C_TREEVIEW].* from my1, [WPF].[dbo].[C_TREEVIEW] where my1.ID = [WPF].[dbo].[C_TREEVIEW].PID
)
delete from [WPF].[dbo].[C_TREEVIEW] where exists (select ID from my1 where my1.ID = [WPF].[dbo].[C_TREEVIEW].PID)

--7.递归删除语句 删除该节点下面所有的子节点(同时删除当前节点)
with my1 as
(
    select * from [WPF].[dbo].[C_TREEVIEW] where ID = 24
    union all 
    select [WPF].[dbo].[C_TREEVIEW].* from my1, [WPF].[dbo].[C_TREEVIEW] where my1.ID = [WPF].[dbo].[C_TREEVIEW].PID
)
delete from [WPF].[dbo].[C_TREEVIEW] 
where exists (select ID from my1 where my1.ID = [WPF].[dbo].[C_TREEVIEW].ID )



--设置递归级数
             ;WITH t AS 
(
  SELECT 1 AS num
  UNION ALL
  SELECT num+1 FROM t
  WHERE num<200
)
SELECT * FROM t
OPTION(MAXRECURSION 0)

 

posted @ 2019-10-07 00:52  <--青青子衿-->  阅读(235)  评论(0编辑  收藏  举报
// /**/ // 在页脚Html代码 引入 // function btn_donateClick() { var DivPopup = document.getElementById('Div_popup'); var DivMasklayer = document.getElementById('div_masklayer'); DivMasklayer.style.display = 'block'; DivPopup.style.display = 'block'; var h = Div_popup.clientHeight; with (Div_popup.style) { marginTop = -h / 2 + 'px'; } } function MasklayerClick() { var masklayer = document.getElementById('div_masklayer'); var divImg = document.getElementById("Div_popup"); masklayer.style.display = "none"; divImg.style.display = "none"; } setTimeout( function () { document.getElementById('div_masklayer').onclick = MasklayerClick; document.getElementById('btn_donate').onclick = btn_donateClick; var a_gzw = document.getElementById("guanzhuwo"); a_gzw.href = "javascript:void(0);"; $("#guanzhuwo").attr("onclick","follow('33513f9f-ba13-e011-ac81-842b2b196315');"); }, 900);