我安装的节点上,KeyValuePair表按的问题,并与一些样本值填充,这样我的层次结构如下:
Root
| --- A
| | --- A1
| | --- A2
|
| ---乙
| --- B1
| --- B2
我分配两个属性,命名为 “属性1” 和 “属性2”,每个在根中分别用值“根支柱1”和“根支柱2”定义。在A中,我将“属性1”替换为“A属性1”的值,在B中,我将“属性2”替换为值“B属性2”。
set identity_insert Node on
insert into Node(ID,ParentID,Name)
values (1,null,'Root'),(2,1,'A'),(3,1,'B'),(4,2,'A1'),(5,2,'A2'),
(6,3,'B1'),(7,3,'B2')
set identity_insert Node off
insert into KeyValuePair(KeyName, [Value], NodeID)
values ('Property 1','Root Prop 1',1),
('Property 2','Root Prop 2',1),
('Property 1','A Prop 1',2),
('Property 2','B Prop 2',3)
调用Nathan的节点A1解决方案不会产生行!
的其中Nathan的解决方案条款应的键和V之间的加入条件,导致如下所示的修订程序(也我已经改名DataValue到KeyValuePair要与原来的问题一致):
create procedure dbo.ListDataValues
@nodeid bigint
as
begin
with nodes as (
select ID, ParentID, 0 as Level
from Node n where [email protected]
union all
select n.ID, n.ParentID, c.Level+1 as Level
from Node n inner join nodes c on c.ParentID = n.ID
),
keys as (
select distinct(KeyName)
from KeyValuePair
where NodeID in (select ID from nodes)
)
select
keys.KeyName,
v.Value,
i.Value as [InheritedValue],
i.NodeID as [InheritedFromNodeID]
from
keys
left join KeyValuePair v on v.KeyName = keys.KeyName
and v.NodeID = @nodeid
left join KeyValuePair i on i.KeyName = keys.KeyName
and i.NodeID = (select top 1 NodeID from KeyValuePair d
inner join nodes k on k.ID = d.NodeID
where Level > 0 and d.KeyName = i.KeyName
order by [Level])
end
go
这得到正确的结果如预期:
KeyName Value InheritedValue InheritedFromNodeID
------------ ------- ----------------- --------------------
Property 1 NULL A Prop 1 2
Property 2 NULL Root Prop 2 1
你能澄清:你的意思是它继承的值吗?说,有问题的节点,它的父节点和它的祖父节点都有不同的值 - 它们中的哪一个在结果中被认为是InheritedValue? – VladV 2010-03-01 10:33:28
几个例子的确会让我们更容易理解。我会建议添加一些插入语句和预期的输出,包括你的角落案例。 – 2010-03-01 10:43:56
@VladV - 任何给定节点的值总是覆盖其祖先的值。因此,如果父母和祖父母都有一个给定的密钥的值,我想为父母,而不是祖父母的价值。如果家长没有钥匙的价值,那么我会采取祖父母的价值(假设祖父母有一个该钥匙的价值) – 2010-03-01 11:03:11