Я настроил таблицы Node и KeyValuePair в соответствии с вопросом и заполнил некоторыми примерами значений, так что моя иерархия была следующей:
Root
| ---
| | --- A1
| | --- A2
|
| --- B
| --- B1
| --- B2
Я назначил два свойства с именами «Свойство 1» и «Свойство 2», каждое из которых определено в корне со значениями «Корневая поддержка 1» и «Корневая поддержка 2» соответственно. В A я переопределил «Свойство 1» со значением «A Prop 1», а в B я переопределил «Свойство 2» со значением «B Prop 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)
Вызов решения Натана для узла A1 не приводит к появлению строк!
Предложение where в решении Натана должно быть условием соединения ключей и v, в результате чего приведенная ниже пересмотренная процедура (также я переименовал DataValue в KeyValuePair, чтобы соответствовать первоначальному вопросу):
create procedure dbo.ListDataValues
@nodeid bigint
as
begin
with nodes as (
select ID, ParentID, 0 as Level
from Node n where ID=@nodeid
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