2011-03-30 75 views
0

我有兩個表,一個是代碼,另一個是子映射表,用於代表與代碼表的父子關係。在SQL服務器中將層次結構表元素轉換爲xml格式

表:代碼

Code ID | Code Value | code Group | code Desc 
1    Person 1  Accounts  cashier 
2    Person 2  Finance  teller 
3    Person 3  HR   administrator 
4    Person 4  IT   system admin 

表:映射

Id (Primarykey)  | code ID | Parent Code ID (both code ID and parent code ID are foreign keys with codes table 
1      1   Null 
2      2   1 
3      3   1 
4      4   Null 
5      3   4 

我需要一個輸出

<Codes> 
<CodeParent group = "Accounts"> 
    <ChildCodes group= "Finance"> 
     <CodeParent name = "person 2" desc = "teller"/> 
    </ChildCodes> 
    <ChildCodes group = "HR"> 
     <CodeParent name = "Person 3" desc = "Administrator"/> 
    <ChildCodes>  
</CodeParent > 
<CodeParent group = "IT> 
    <ChildCodes group = "HR"> 
     <CodeParent name = "Person 3" desc = "Administrator"/> 
    <ChildCodes> 
</CodeParent > 
</Root> 

我用這個SQL函數嘗試,但它似乎並沒有給正確的期望輸出

ALTER FUNCTION dbo.GetPartsSubTree(@PartNumberID int) 
RETURNS XML 
BEGIN RETURN 
(SELECT codeMappingTable.codeID AS "@codeID", 
codes.codeLiteral AS "@codeLiteral", 
codes.codeGroup AS "@codeGroup", 
dbo.GetPartsSubTree(codeMappingTable.codeID) 
FROM codeMappingTable,codes 

WHERE [email protected] and codes.codeID = codeMappingTable.codeID 
ORDER BY codeMappingTable.codeID 
FOR XML PATH('CodeParent'),ROOT('ChildCodes'),TYPE) 
END 

GO 

SELECT codeMappingTable.codeID AS "@codeID", 
codes.codeLiteral AS "@codeLiteral", 
codes.codeGroup AS "@codeGroup", 
dbo.GetPartsSubTree(codeMappingTable.codeID) 
FROM codeMappingTable,codes 
WHERE codeMappingTable.ParentcodeID is null and codes.codeID = codeMappingTable.codeID 
ORDER BY codeMappingTable.codeID 
FOR XML PATH('CodeParent'),ROOT('Codes'),TYPE 

請幫我解決這個問題。

在一個更大的尺度的期望輸出是如下:

<Codes> 
    <codeGroup codeGroup="Entity"> 
    <CodeParent codeID="18" codeDesc="Borrower" codeGroup="Entity"> 
     <ChildCodes codeGroup="Fin Reporting Type"> 
     <CodeParent codeID="20" codeDesc="Financial Statement - Annual" codeGroup="Fin Reporting Type" /> 
     <CodeParent codeID="21" codeDesc="Tax Returns" codeGroup="Fin Reporting Type" /> 
     </ChildCodes> 
     <ChildCodes codeGroup="Covenant Type"> 
     <CodeParent codeID="24" codeDesc="Capital Expenditures" codeGroup="Covenant Type" /> 
     <CodeParent codeID="25" codeDesc="Cash Flow Coverage Ratio" codeGroup="Covenant Type" /> 
     </ChildCodes> 
    </CodeParent> 
    <CodeParent codeID="17" codeDesc="Guarantor" codeGroup="Entity"> 
     <ChildCodes codeGroup="Fin Reporting Type"> 
     <CodeParent codeID="20" codeDesc="Financial Statement - Annual" codeGroup="Fin Reporting Type" /> 
     <CodeParent codeID="22" codeDesc="Brokerage Statements" codeGroup="Fin Reporting Type" /> 
     </ChildCodes> 
     <ChildCodes codeGroup="Covenant Type"> 
     <CodeParent codeID="27" codeDesc="Current Ratio" codeGroup="Covenant Type" /> 
     <CodeParent codeID="28" codeDesc="Debt Service Coverage Ratio" codeGroup="Covenant Type" /> 
     </ChildCodes> 
    </CodeParent> 
    </codeGroup> 
    <codeGroup codeGroup="Entity Category"> 
    <CodeParent codeID="4" codeDesc="Company" codeGroup="Entity Category"> 
     <ChildCodes codeGroup="AFS Obligor Type"> 
     <CodeParent codeID="9" codeDesc="American Subsidiary or Agency of Japanese TR Co" codeGroup="AFS Obligor Type"> 
      <ChildCodes codeGroup="test type"> 
      <CodeParent codeID="29" codeDesc="xyz" codeGroup="test type" /> 
      <CodeParent codeID="30" codeDesc="www" codeGroup="test type" /> 
      </ChildCodes> 
     </CodeParent> 
     <CodeParent codeID="11" codeDesc="Cooperative" codeGroup="AFS Obligor Type" /> 
     <CodeParent codeID="13" codeDesc="Corporation" codeGroup="AFS Obligor Type" /> 
     </ChildCodes> 
    </CodeParent> 
    <CodeParent codeID="8" codeDesc="Individual" codeGroup="Entity Category"> 
     <ChildCodes codeGroup="AFS Obligor Type"> 
     <CodeParent codeID="1" codeDesc="US Bancorp Employee" codeGroup="AFS Obligor Type" /> 
     <CodeParent codeID="3" codeDesc="US Bancorp Officer" codeGroup="AFS Obligor Type" /> 
     </ChildCodes> 
    </CodeParent> 
    <CodeParent codeID="5" codeDesc="LLC" codeGroup="Entity Category" /> 
    <CodeParent codeID="6" codeDesc="Trust" codeGroup="Entity Category"> 
     <ChildCodes codeGroup="AFS Obligor Type"> 
     <CodeParent codeID="1" codeDesc="US Bancorp Employee" codeGroup="AFS Obligor Type" /> 
     </ChildCodes> 
    </CodeParent> 
    </codeGroup> 
    <codeGroup codeGroup="Category"> 
    <CodeParent codeID="31" codeDesc="cat1" codeGroup="Category" /> 
    <CodeParent codeID="32" codeDesc="cat2" codeGroup="Category" /> 
    <CodeParent codeID="33" codeDesc="cat3" codeGroup="Category" /> 
    </codeGroup> 
    <codeGroup codeGroup="Facility"> 
    <CodeParent codeID="34" codeDesc="cat1" codeGroup="Facility" > 
     <ChildCodes codeGroup="BorrowerType"> 
     <CodeParent codeID="40" codeDesc="Employee" codeGroup="BorrowerType" /> 
     <CodeParent codeID="41" codeDesc="Officer" codeGroup="BorrowerType" /> 
     </ChildCodes> 
    </CodeParent> 
    <CodeParent codeID="35" codeDesc="cat2" codeGroup="Facility" /> 
    <CodeParent codeID="36" codeDesc="cat3" codeGroup="Facility" /> 
    </codeGroup> 
    <codeGroup codeGroup="Loan"> 
    <CodeParent codeID="37" codeDesc="cat1" codeGroup="Loan" > 
     <ChildCodes codeGroup="BorrowerType"> 
     <CodeParent codeID="40" codeDesc="Employee" codeGroup="BorrowerType" /> 
     <CodeParent codeID="41" codeDesc="Officer" codeGroup="BorrowerType" /> 
     </ChildCodes> 
    </CodeParent> 
    <CodeParent codeID="38" codeDesc="cat2" codeGroup="Loan" /> 
    <CodeParent codeID="39" codeDesc="cat3" codeGroup="Loan" /> 
    </codeGroup> 
</Codes> 

回答

0
declare @Codes table(ID int, CodeValue varchar(10), CodeGroup varchar(10), CodeDesc varchar(20)) 
declare @Mapping table(ID int, CodeID int, ParentCodeID int) 

insert into @Codes values 
(1, 'Person 1', 'Accounts', 'cashier'), 
(2, 'Person 2', 'Finance', 'teller'), 
(3, 'Person 3', 'HR',  'administrator'), 
(4, 'Person 4', 'IT',  'system admin'), 
(5, 'Person 5', 'Accounts', 'accountant'), 
(6, 'Person 6', 'Finance', 'Investbanker') 

insert into @Mapping values 
(1, 1, null), 
(2, 2, 1), 
(3, 3, 1), 
(4, 4, null), 
(5, 3, 4), 
(6, 5, null), 
(7, 6, 1) 

select 
    CRoot.CodeGroup as '@group', 
    (select 
    CChild.CodeGroup as '@group', 
    CChild.CodeValue as 'CodeParent/@name', 
    CChild.CodeDesc as 'CodeParent/@desc' 
    from @Mapping as MChild 
    inner join @Codes as CChild 
     on MChild.CodeID = CChild.ID 
    where MChild.ParentCodeID = MRoot.ID 
    for xml path('ChildCodes'), type) 
from @Mapping as MRoot 
    inner join @Codes as CRoot 
    on MRoot.CodeID = CRoot.ID 
where 
    MRoot.ParentCodeID is null 
for xml path('CodeParent'), root('Codes') 

結果

<Codes> 
    <CodeParent group="Accounts"> 
    <ChildCodes group="Finance"> 
     <CodeParent name="Person 2" desc="teller" /> 
    </ChildCodes> 
    <ChildCodes group="HR"> 
     <CodeParent name="Person 3" desc="administrator" /> 
    </ChildCodes> 
    <ChildCodes group="Finance"> 
     <CodeParent name="Person 6" desc="Investbanker" /> 
    </ChildCodes> 
    </CodeParent> 
    <CodeParent group="IT"> 
    <ChildCodes group="HR"> 
     <CodeParent name="Person 3" desc="administrator" /> 
    </ChildCodes> 
    </CodeParent> 
    <CodeParent group="Accounts" /> 
</Codes> 
+0

我想你的代碼的Mikael,它的工作原理然而,當我有它無法處理它,例如見下文 – Hema 2011-03-30 15:27:17

+0

我想你的代碼的Mikael表中多個嵌套條目,它的工作原理然而,當我有多個嵌套條目(5,'Person 5','Accounts','accountant') 插入@Codes 值(6,'Person 6','Finance' ','Investbanker') 插入@Mapping值(6,5,null) 插入@Mapping值(7,6,1) 它爲帳戶創建多個節點併爲財務創建多個節點 – Hema 2011-03-30 15:41:14

+0

@Hema - 已更新回答你的新數據。您在第一個「accounts」節點「Finance」下添加了一個新的根項目「accounts」和新項目。那不是你想要的嗎?如果不是,請用輸入數據和預期輸出更新您的問題。 – 2011-03-30 16:41:19

0

的Mikael,我具有上述表 1)父在以下可能關係代碼組本身就是它自己的。 2)父代碼組驅動一個子組 3)父代碼組驅動兩個不同的子組 4)父代碼組驅動子組,並且子組intint驅動子組 5)孩子組有兩個不同的父組

當所有關係存在時,以下是所需的代碼輸出。

<Codes> 
     <codeGroup codeGroup="Entity"> 
     <CodeParent codeID="18" codeDesc="Borrower" codeGroup="Entity"> 
      <ChildCodes codeGroup="Fin Reporting Type"> 
      <CodeParent codeID="20" codeDesc="Financial Statement - Annual" codeGroup="Fin Reporting Type" /> 
      <CodeParent codeID="21" codeDesc="Tax Returns" codeGroup="Fin Reporting Type" /> 
      </ChildCodes> 
      <ChildCodes codeGroup="Covenant Type"> 
      <CodeParent codeID="24" codeDesc="Capital Expenditures" codeGroup="Covenant Type" /> 
      <CodeParent codeID="25" codeDesc="Cash Flow Coverage Ratio" codeGroup="Covenant Type" /> 
      </ChildCodes> 
     </CodeParent> 
     <CodeParent codeID="17" codeDesc="Guarantor" codeGroup="Entity"> 
      <ChildCodes codeGroup="Fin Reporting Type"> 
      <CodeParent codeID="20" codeDesc="Financial Statement - Annual" codeGroup="Fin Reporting Type" /> 
      <CodeParent codeID="22" codeDesc="Brokerage Statements" codeGroup="Fin Reporting Type" /> 
      </ChildCodes> 
      <ChildCodes codeGroup="Covenant Type"> 
      <CodeParent codeID="27" codeDesc="Current Ratio" codeGroup="Covenant Type" /> 
      <CodeParent codeID="28" codeDesc="Debt Service Coverage Ratio" codeGroup="Covenant Type" /> 
      </ChildCodes> 
     </CodeParent> 
     </codeGroup> 
     <codeGroup codeGroup="Entity Category"> 
     <CodeParent codeID="4" codeDesc="Company" codeGroup="Entity Category"> 
      <ChildCodes codeGroup="AFS Obligor Type"> 
      <CodeParent codeID="9" codeDesc="American Subsidiary or Agency of Japanese TR Co" codeGroup="AFS Obligor Type"> 
       <ChildCodes codeGroup="test type"> 
       <CodeParent codeID="29" codeDesc="xyz" codeGroup="test type" /> 
       <CodeParent codeID="30" codeDesc="www" codeGroup="test type" /> 
       </ChildCodes> 
      </CodeParent> 
      <CodeParent codeID="11" codeDesc="Cooperative" codeGroup="AFS Obligor Type" /> 
      <CodeParent codeID="13" codeDesc="Corporation" codeGroup="AFS Obligor Type" /> 
      </ChildCodes> 
     </CodeParent> 
     <CodeParent codeID="8" codeDesc="Individual" codeGroup="Entity Category"> 
      <ChildCodes codeGroup="AFS Obligor Type"> 
      <CodeParent codeID="1" codeDesc="US Bancorp Employee" codeGroup="AFS Obligor Type" /> 
      <CodeParent codeID="3" codeDesc="US Bancorp Officer" codeGroup="AFS Obligor Type" /> 
      </ChildCodes> 
     </CodeParent> 
     <CodeParent codeID="5" codeDesc="LLC" codeGroup="Entity Category" /> 
     <CodeParent codeID="6" codeDesc="Trust" codeGroup="Entity Category"> 
      <ChildCodes codeGroup="AFS Obligor Type"> 
      <CodeParent codeID="1" codeDesc="US Bancorp Employee" codeGroup="AFS Obligor Type" /> 
      </ChildCodes> 
     </CodeParent> 
     </codeGroup> 
     <codeGroup codeGroup="Category"> 
     <CodeParent codeID="31" codeDesc="cat1" codeGroup="Category" /> 
     <CodeParent codeID="32" codeDesc="cat2" codeGroup="Category" /> 
     <CodeParent codeID="33" codeDesc="cat3" codeGroup="Category" /> 
     </codeGroup> 
     <codeGroup codeGroup="Facility"> 
      <CodeParent codeID="34" codeDesc="cat1" codeGroup="Facility" > 
     <ChildCodes codeGroup="BorrowerType"> 
     <CodeParent codeID="40" codeDesc="Employee" codeGroup="BorrowerType" /> 
     <CodeParent codeID="41" codeDesc="Officer" codeGroup="BorrowerType" /> 
     </ChildCodes> 
    </CodeParent> 
    <CodeParent codeID="35" codeDesc="cat2" codeGroup="Facility" /> 
    <CodeParent codeID="36" codeDesc="cat3" codeGroup="Facility" /> 
    </codeGroup> 
    <codeGroup codeGroup="Loan"> 
    <CodeParent codeID="37" codeDesc="cat1" codeGroup="Loan" > 
     <ChildCodes codeGroup="BorrowerType"> 
     <CodeParent codeID="40" codeDesc="Employee" codeGroup="BorrowerType" /> 
     <CodeParent codeID="41" codeDesc="Officer" codeGroup="BorrowerType" /> 
     </ChildCodes> 
    </CodeParent> 
    <CodeParent codeID="38" codeDesc="cat2" codeGroup="Loan" /> 
    <CodeParent codeID="39" codeDesc="cat3" codeGroup="Loan" /> 
    </codeGroup> 
    </Codes>