有一张用户表,里面的用户有推荐关系!我现在新增了几个新用户!我想往推荐人身上加积分!假如 A→B→C→D→E→F→G→H
→表示推荐我现在获取到了H H用户有一个字段是他的推荐人ID我如何往G上加完推荐积分,
然后在查G的推荐人F,往F头上加积分之后
又查到F的推荐人E。这样一直循环加到A
用游标可以实现嘛 !??
→表示推荐我现在获取到了H H用户有一个字段是他的推荐人ID我如何往G上加完推荐积分,
然后在查G的推荐人F,往F头上加积分之后
又查到F的推荐人E。这样一直循环加到A
用游标可以实现嘛 !??
解决方案 »
- VS2008自带SQLserver2005能不能卸载,安个企业版的
- SQL如何把查询出来的记录保留整数
- SQL中把一个表的所有数据移到另一表中
- sql2000权限问题
- 这个SqlServer 存储过程怎么写?
- 请教大家一个Dts工程题,还是很有难度的,在线等待
- 关于sql server的安全,偶有几句话要说.
- 如何 判断语句经过修改执行的 效率 与原来的比较 ? 有几种方法? 哪个最好, 是看哪些参数 I/O ,CPU READ/WRITE 还是其他???
- 为什么我连接不上mysql?
- MySQL安装出现以下情况什么原因???????????
- 为什么列名无效?
- microsoft sql 企业管理器 建表时出现错误:mmc检测到此管理单元发生一个错误 建议您关闭并重新启动mmc
if object_id('[tb]') is not null drop table [tb]
create table [tb] (id int,name varchar(1),pid int)
insert into [tb]
select 1,'A',0 union all
select 2,'B',1 union all
select 3,'D',1 union all
select 4,'C',2 union all
select 5,'D',2 union all
select 6,'A',4 union all
select 7,'E',5 union all
select 8,'F',5
GO
;with cte
as
(
select *,[path]=cast([name]+'->' as varchar(100)) ,[level] = 1 from tb where pid = 0
union all
select a.*, cast(c.[path]+a.[name]+'->' as varchar(100)),[level]+1 from cte c ,tb a where a.pid = c.id
)
select
*
from cte
where len([path]) > 6 and right([path],3) = left([path],3)
/*
id name pid path level
----------- ---- ----------- -------------- -----
6 A 4 A->B->C->A-> 4(1 行受影响)
*/------------------------------------------------------------------------
-- Author : happyflystone
-- Date : 2010-04-06
-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
--
-------------------------------------------------------------------------- Test Data: ta
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
Go
CREATE TABLE tb([cid] NVARCHAR(1),[pid] NVARCHAR(1))
Go
INSERT INTO tb
SELECT 'A','B' UNION ALL
SELECT 'A','D' UNION ALL
SELECT 'B','C' UNION ALL
SELECT 'B','D' UNION ALL
SELECT 'C','A' UNION ALL
SELECT 'D','E' UNION ALL
SELECT 'D','F'
GO
--Start
;with cte
as
(
select *,[path]=cast([cid]+'->' as varchar(100)) ,[level] = 1
from (select distinct cid,cast('' as nvarchar(1)) as pid from tb union select distinct pid ,'' from tb) b
union all
select a.*,cast(a.[cid]+'->'+c.[path] as varchar(100)),[level]+1
from cte c ,tb a
where a.pid = c.cid and charindex(a.[cid]+'->',c.[path])=0
)
select
[path]+cid+'->'
from cte
where exists(select 2 from tb where cid+'->' = right([path],3) and pid+'->' = left([path],3))-- = left([path],3)
--Result:
/*
--------------
A->B->C->A->
C->A->B->C->
B->C->A->B->(3 行受影响)*/
--End
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2010/04/06/5456223.aspxBOM循环问题,参考上诉资料
/*
标题:SQL SERVER 2000中查询指定节点及其所有父节点的函数(表格形式显示)
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-05-12
地点:广东深圳
*/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' , '松岗镇')
go--查询指定节点及其所有父节点的函数
create function f_pid(@id varchar(3)) returns @t_level table(id varchar(3))
as
begin
insert into @t_level select @id
select @id = pid from tb where id = @id and pid is not null
while @@ROWCOUNT > 0
begin
insert into @t_level select @id
select @id = pid from tb where id = @id and pid is not null
end
return
end
go--调用函数查询002(广州市)及其所有父节点
select a.* from tb a , f_pid('002') b where a.id = b.id order by a.id
/*
id pid name
---- ---- ----------
001 NULL 广东省
002 001 广州市(所影响的行数为 2 行)
*/--调用函数查询003(深圳市)及其所有父节点
select a.* from tb a , f_pid('003') b where a.id = b.id order by a.id
/*
id pid name
---- ---- ----------
001 NULL 广东省
003 001 深圳市(所影响的行数为 2 行)
*/--调用函数查询008(西乡镇)及其所有父节点
select a.* from tb a , f_pid('008') b where a.id = b.id order by a.id
/*
id pid name
---- ---- ----------
001 NULL 广东省
003 001 深圳市
007 003 宝安区
008 007 西乡镇(所影响的行数为 4 行)
*/drop table tb
drop function f_pid@@ROWCOUNT:返回受上一语句影响的行数。
返回类型:integer。
注释:任何不返回行的语句将这一变量设置为 0 ,如 IF 语句。
示例:下面的示例执行 UPDATE 语句并用 @@ROWCOUNT 来检测是否有发生更改的行。UPDATE authors SET au_lname = 'Jones' WHERE au_id = '999-888-7777'
IF @@ROWCOUNT = 0
print 'Warning: No rows were updated'结果:(所影响的行数为 0 行)
Warning: No rows were updated
/*
标题:SQL SERVER 2005中查询指定节点及其所有父节点的方法(表格形式显示)
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2010-02-02
地点:新疆乌鲁木齐
*/create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
insert into tb values('001' , null , N'广东省')
insert into tb values('002' , '001' , N'广州市')
insert into tb values('003' , '001' , N'深圳市')
insert into tb values('004' , '002' , N'天河区')
insert into tb values('005' , '003' , N'罗湖区')
insert into tb values('006' , '003' , N'福田区')
insert into tb values('007' , '003' , N'宝安区')
insert into tb values('008' , '007' , N'西乡镇')
insert into tb values('009' , '007' , N'龙华镇')
insert into tb values('010' , '007' , N'松岗镇')
goDECLARE @ID VARCHAR(3)--查询ID = '001'的所有父节点
SET @ID = '001'
;WITH T AS
(
SELECT ID , PID , NAME
FROM TB
WHERE ID = @ID
UNION ALL
SELECT A.ID , A.PID , A.NAME
FROM TB AS A JOIN T AS B ON A.ID = B.PID
)
SELECT * FROM T ORDER BY ID
/*
ID PID NAME
---- ---- ----------
001 NULL 广东省(1 行受影响)
*/--查询ID = '002'的所有父节点
SET @ID = '002'
;WITH T AS
(
SELECT ID , PID , NAME
FROM TB
WHERE ID = @ID
UNION ALL
SELECT A.ID , A.PID , A.NAME
FROM TB AS A JOIN T AS B ON A.ID = B.PID
)
SELECT * FROM T ORDER BY ID
/*
ID PID NAME
---- ---- ----------
001 NULL 广东省
002 001 广州市(2 行受影响)
*/--查询ID = '003'的所有父节点
SET @ID = '003'
;WITH T AS
(
SELECT ID , PID , NAME
FROM TB
WHERE ID = @ID
UNION ALL
SELECT A.ID , A.PID , A.NAME
FROM TB AS A JOIN T AS B ON A.ID = B.PID
)
SELECT * FROM T ORDER BY ID
/*
ID PID NAME
---- ---- ----------
001 NULL 广东省
003 001 深圳市(2 行受影响)
*/--查询ID = '009'的所有父节点
SET @ID = '009'
;WITH T AS
(
SELECT ID , PID , NAME
FROM TB
WHERE ID = @ID
UNION ALL
SELECT A.ID , A.PID , A.NAME
FROM TB AS A JOIN T AS B ON A.ID = B.PID
)
SELECT * FROM T ORDER BY ID
/*
ID PID NAME
---- ---- ----------
001 NULL 广东省
003 001 深圳市
007 003 宝安区
009 007 龙华镇(4 行受影响)
*/drop table tb--注:除ID值不一样外,四个SQL语句是一样的。
--查询ID = '009'的所有父节点
SET @ID = '009'
;WITH T AS
(
SELECT ID , PID , NAME
FROM TB
WHERE ID = @ID
UNION ALL
SELECT A.ID , A.PID , A.NAME
FROM TB AS A JOIN T AS B ON A.ID = B.PID
)
SELECT * FROM T ORDER BY ID
这里得到的数据如何循环呢?可以弄到游标里面循环吗?还是我定义个游标 查询语句就是这样的?
/*
标题:SER SERVER 2005中统计各节点及其子节点的数量及合计(逐级汇总)
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2011-05-06
地点:重庆航天职业学院id pid name cnt
---- ---- ---------- -----------
001 NULL 广东省 0
002 001 广州市 0
003 001 深圳市 0
004 002 天河区 0
005 003 罗湖区 0
006 003 福田区 0
007 003 宝安区 0
008 007 西乡镇 1
009 007 龙华镇 2
010 007 松岗镇 3
011 006 岗下镇 4
012 005 上沙镇 5
013 004 天河镇 6-->统计结果如下:
id name unit sum_cnt
---- ---------- ----------- -----------
001 广东省 13 21
002 广州市 3 6
003 深圳市 9 15
004 天河区 2 6
005 罗湖区 2 5
006 福田区 2 4
007 宝安区 4 6
008 西乡镇 1 1
009 龙华镇 1 2
010 松岗镇 1 3
011 岗下镇 1 4
012 上沙镇 1 5
013 天河镇 1 6*/create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10) , cnt int)
insert into tb values('001' , null , N'广东省' , 0)
insert into tb values('002' , '001' , N'广州市' , 0)
insert into tb values('003' , '001' , N'深圳市' , 0)
insert into tb values('004' , '002' , N'天河区' , 0)
insert into tb values('005' , '003' , N'罗湖区' , 0)
insert into tb values('006' , '003' , N'福田区' , 0)
insert into tb values('007' , '003' , N'宝安区' , 0)
insert into tb values('008' , '007' , N'西乡镇' , 1)
insert into tb values('009' , '007' , N'龙华镇' , 2)
insert into tb values('010' , '007' , N'松岗镇' , 3)
insert into tb values('011' , '006' , N'岗下镇' , 4)
insert into tb values('012' , '005' , N'上沙镇' , 5)
insert into tb values('013' , '004' , N'天河镇' , 6)
go;WITH T AS
(
SELECT ID , PID , NAME , CNT FROM TB
UNION ALL
SELECT B.ID , A.PID , A.NAME , B.CNT FROM TB AS A JOIN T AS B ON A.ID = B.PID
)
SELECT p.id , p.name , count(1) unit, sum(t.cnt) sum_cnt FROM tb p , t
where isnull(p.pid,'000') = isnull(t.pid,'000') and p.name = t.name group by p.id , p.name order by p.id drop table tb