跪求SQL2005查询语句!!!
求SQL2005查询语句
表t
id 姓名 年龄
01 李白 20
02 杜甫 21
03 张飞 22
04 宋江 24
05 岳飞 25
匹配情况如下(不唯一)
id 姓名 年龄 id2 姓名2 年龄2
01 李白 20 02 杜甫 21
02 杜甫 21 03 张飞 22
03 张飞 22 04 宋江 23
04 宋江 23 05 岳飞
05 岳飞 24
条件:
1、将年龄差值=1岁的进行匹配;
2、一列中id(id2)不能出现重复值;
比如可以和杜甫匹配的有李白、张飞,只能任选一人匹配,且已匹配过的,比如李白和张飞任一人和杜甫匹配过,就不能再和其他人匹配。
3、使匹配数量达到最大化。即ID2最多;
如下为错误:
id 姓名 年龄 id2 姓名2 年龄2
01 李白 20 02 杜甫 21
02 杜甫 21 01 李白 20
02 杜甫 21 03 张飞 22
03 宋江 23 03 张飞 22
。。。
因为在ID和id2中均出现重复值。
[解决办法]
如果改宋江的年龄:
create table tb(id varchar(10),姓名 nvarchar(10),年龄 int)insert into tb select '01','李白',20insert into tb select '02','杜甫',21insert into tb select '03','张飞',22insert into tb select '04','宋江',23 --假如这里改成23insert into tb select '05','岳飞',25go;with cte as(select 1 as rn,id as id1,* from tb a where exists(select 1 from tb where 年龄=a.年龄+1)and not exists(select 1 from tb where 年龄=a.年龄-1)union allselect a.rn+1,a.id1,b.* from cte a inner join tb b on a.年龄=b.年龄-1)select a.id,a.姓名,a.年龄,b.id as id2,b.姓名 as 姓名2,b.年龄 as 年龄2 from cte a inner join cte b on a.id1=b.id1 and a.rn=b.rn-1where exists(select 1 from cte where id1=a.id1 and rn=(select max(rn) from cte))/*id 姓名 年龄 id2 姓名2 年龄2---------- ---------- ----------- ---------- ---------- -----------01 李白 20 02 杜甫 2102 杜甫 21 03 张飞 2203 张飞 22 04 宋江 23(3 行受影响)*/godrop table tb
[解决办法]