信息技术

当前位置: 主页 > 数据库 > MSSQL >

查找节点属性值并根据某列排序

时间:2010-05-18 16:25来源:未知 作者:admin 点击:
需求是这样的:首先有3张表a,b,c 表a有三个字段 属性id prop_id,节点 cate_node_id,顺序 level_no 表b是一个树,用来找表a中属性节点和表c中属性节点之间的关系的 节点id,父节点id 表c是人和属性及

需求是这样的:首先有3张表a,b,c
表a有三个字段
属性id prop_id,节点 cate_node_id,顺序 level_no
表b是一个树,用来找表a中属性节点和表c中属性节点之间的关系的
节点id,父节点id
表c是人和属性及该属性拥有的值
userid 属性id prop_id, 节点id cate_node_id
首先现在表c中找到各个属性的值是a中对应属性值的父级或平级
在找到很多人之后,按照表A中的属性顺序一个一个属性去对比人,直到只剩一个人或者属性对比完,代码如下:

;with t as
(
   
select b.* ,lvl=0  from b b,a a
   
where a.cate_node_id=b.[cate_node_id]
       
   
union all
   
select n.* ,lvl+1 from t m,b n where m.parent_id=n.cate_node_id
)
,t1
as
(
   
select c.[User_Id],c.Prop_id Prop_Id,--t.parent_id,
        c.cate_node_id Cate_Node_Id,
        t.lvl,cnt
=count(1)over(partition by [User_Id])
   
from t
       
join c  c
           
on t.cate_node_id=c.cate_node_id
           
)
,t2
as
(
   
select
        t1 .
*,abs(t1.Cate_Node_Id-a.cate_node_id) 差值,
   
--    top 1 with ties [User_Id]
        AProp_Id=a.Prop_id,ACate_Node_Id=a.cate_node_id,ALevel_No=a.Level_No
   
from t1
       
join a a
           
on t1.prop_id=a.Prop_id
           
   
where cnt=(select count(1) from a
               
                )
)
,t3
as
(
   
select *,px=(select ','+right(10000+lvl,4) from t2 x where [User_Id]=t2.[User_Id] order by ALevel_No,差值 for xml path(''))
   
from t2
)
,t4
as
(
   
select top 1 with ties [User_id]
   
from t3
   
order by px
)
select distinct * from t4

(责任编辑:admin)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片