SQL查询朋友关系圈应用实例

原贴:http://topic.csdn.net/u/20100412/11/a4ea520e-7dd0-44d2-98bb-9f62f0ed6160.html?21233

 

--------------------------------------------------------------------------

--  Author : htl258(Tony)

--  Date   : 2010-04-14 06:02:36

--  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)

--          Jul  9 2008 14:43:34

--          Copyright (c) 1988-2008 Microsoft Corporation

--          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)

--------------------------------------------------------------------------

--> 生成测试数据表:tb

 

IF NOT OBJECT_ID('[tb]') IS NULL

    DROP TABLE [tb]

GO

CREATE TABLE [tb]([callno] INT,[calledno] INT,[groupid] INT)

INSERT [tb]

SELECT 111,1000,1 UNION ALL

SELECT 111,2000,1 UNION ALL

SELECT 222,1000,2 UNION ALL

SELECT 222,4000,2 UNION ALL

SELECT 333,5000,3 UNION ALL

SELECT 333,6000,3 UNION ALL

SELECT 444,4000,4 UNION ALL

SELECT 444,1,4 UNION ALL

SELECT 444,2,4 UNION ALL

SELECT 555,55,5 UNION ALL

SELECT 555,5000,5 UNION ALL

--

SELECT 666,8,6 UNION ALL

SELECT 666,88,6 UNION ALL

SELECT 666,888,6 UNION ALL

SELECT 777,9,7 UNION ALL

SELECT 777,99,7 UNION ALL

SELECT 777,999,7 UNION ALL

SELECT 888,44,8 UNION ALL

SELECT 888,444,8 UNION ALL

SELECT 999,66,9 UNION ALL

SELECT 999,666,9 UNION ALL

SELECT 999,44,9 UNION ALL

SELECT 999,99,9 UNION ALL

SELECT 9999,44,10 UNION ALL

SELECT 9999,8,10 UNION ALL

--

SELECT 1,100,100 UNION ALL

SELECT 1,200,100 UNION ALL

SELECT 2,200,200 UNION ALL

SELECT 2,300,200 UNION ALL

SELECT 3,300,300 UNION ALL

SELECT 3,400,300 UNION ALL

SELECT 4,400,400 UNION ALL

SELECT 4,500,400 UNION ALL

SELECT 5,500,500 UNION ALL

SELECT 5,600,500 UNION ALL

SELECT 6,600,600

GO

--SELECT * FROM [tb]

 

-->SQL查询如下:

 

DECLARE @CALLNO INT,@CALLEDNO INT

DECLARE C CURSOR FOR

    SELECT CALLNO,CALLEDNO FROM T

OPEN C

FETCH NEXT FROM C INTO @CALLNO,@CALLEDNO

WHILE @@FETCH_STATUS = 0

BEGIN

    UPDATE T SET

       GROUPID=(SELECT MIN(GROUPID) FROM T WHERE CALLEDNO=@CALLEDNO)

    WHERE CALLNO=@CALLNO

    FETCH NEXT FROM C INTO @CALLNO,@CALLEDNO

END

CLOSE C

DEALLOCATE C

 

SELECT * FROM T

/*

callno      calledno    groupid

----------- ----------- -----------

111         1000        1

111         2000        1

222         1000        1

222         4000        1

333         5000        3

333         6000        3

444         4000        1

444         1           1

444         2           1

555         55          3

555         5000        3

666         8           6

666         88          6

666         888         6

777         9           7

777         99          7

777         999         7

888         44          8

888         444         8

999         66          7

999         666         7

999         44          7

999         99          7

9999        44          6

9999        8           6

1           100         100

1           200         100

2           200         100

2           300         100

3           300         100

3           400         100

4           400         100

4           500         100

5           500         100

5           600         100

6           600         100

 

(36 行受影响)

*/

 



--沟沟的代码:
declare @groupid int, @rowcount int
set  @groupid= -1
while  exists(select 1 from T where groupid>@groupid)
begin
 
select top  1 @groupid= groupid  fromwhere groupid>@groupid order by groupid
 
 
set @rowcount =@@rowcount
 
While @rowcount>0
 
BEGIN
  
 
Update T
 
set groupid= @groupid
 
where calledno in(select calledno from T as A where A.groupid=@groupid)
 
and groupid<>@groupid
 
 
set @rowcount = @@rowcount

  
Update T
 
set groupid=@groupid
 
where callno in (select callno from T as A where A.groupid=@groupid)
 
and groupid<>@groupid

 
set @rowcount =@rowcount +@@rowcount

 
END
end

select * from T
/*
111    1000    1
111    2000    1
222    1000    1
222    4000    1
333    5000    3
333    6000    3
444    4000    1
444    1    1
444    2    1
555    55    3
555    5000    3

666    8    6
666    88    6
666    888    6
777    9    6
777    99    6
777    999    6
888    44    6
888    444    6
999    66    6
999    666    6
999    44    6
999    99    6
9999    44    6
9999    8    6
1    100    100
1    200    100
2    200    100
2    300    100
3    300    100
3    400    100
4    400    100
4    500    100
5    500    100
5    600    100
6    600    100

*/
Drop table T

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值