我安裝的節點上,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