2013-05-10 51 views
1

我在SQL Server中有兩個表與一對多關係。我需要跨這些表執行XQuery中,以獲得一個xml輸出SQL Server 2008 XQuery一對多問題

的臺(和樣品記錄)是那些:

Entity_A

ID Name  Description  Value1  Value2 
------------------------------------------------ 
10 aName1 aDescription1 AttVal1 AttVal2 
11 aName2 aDescription2 AttVal21 AttVal25 

Entity_B

ID ID_Entity_A SubValue 
--------------------------- 
1  10   sv1 
2  10   sv2 
3  10   sv3 
4  10   sv4 
5  11   sv5 
6  11   sv6 

我想獲得執行xquery的輸出是這樣的:

<MyRoot> 
    <EntityNode> 
     <Identification> 
      <Name>aName1</Name> 
      <Description>aDescription1</Description> 
     </Identification> 
     <EntityAttributes> 
      <Value1>AttVal1</Value1> 
      <Value2>AttVal2</Value2> 
      <SubValue>sv1<SubValue> 
      <SubValue>sv2<SubValue> 
      <SubValue>sv3<SubValue> 
      <SubValue>sv4<SubValue> 
     </EntityAttributes> 
    </EntityNode> 
    <EntityNode> 
     <Identification> 
      <Name>aName2</Name> 
      <Description>aDescription2</Description> 
     </Identification> 
     <EntityAttributes> 
      <Value1>AttVal21</Value1> 
      <Value2>AttVal25</Value2> 
      <SubValue>sv5<SubValue> 
      <SubValue>sv6<SubValue> 
     </EntityAttributes> 
    </EntityNode> 
    ... 
</MyRoot> 

,這是我的XQuery運行:

SELECT 
    Name AS 'Identification/Name', 
    Description AS 'Identification/Description', 
    Value1 AS 'EntityAttributes/Value1', 
    Value2 AS 'EntityAttributes/Value2', 
    (
    SELECT 
     SubValue AS SubValue 
    FROM 
     Entity_B 
    WHERE 
     Entity_B.ID_Entity_A = Entity_A.ID 
    FOR XML PATH(''), ROOT('EntityAttributes'), TYPE) 
FROM Entity_A 
FOR XML PATH('EntityNode'), ROOT('MyRoot'), ELEMENTS 

但我得到的輸出是這樣的(從所需的輸出不同):

<MyRoot> 
    <EntityNode> 
     <Identification> 
      <Name>aName1</Name> 
      <Description>aDescription1</Description> 
     </Identification> 
     <EntityAttributes> 
      <Value1>AttVal1</Value1> 
      <Value2>AttVal2</Value2> 
     </EntityAttributes> 
     <EntityAttributes> 
      <SubValue>sv1<SubValue> 
      <SubValue>sv2<SubValue> 
      <SubValue>sv3<SubValue> 
      <SubValue>sv4<SubValue> 
     </EntityAttributes> 
    </EntityNode> 
    <EntityNode> 
     <Identification> 
      <Name>aName2</Name> 
      <Description>aDescription2</Description> 
     </Identification> 
     <EntityAttributes> 
      <Value1>AttVal21</Value1> 
      <Value2>AttVal25</Value2> 
     </EntityAttributes> 
     <EntityAttributes> 
      <SubValue>sv5<SubValue> 
      <SubValue>sv6<SubValue> 
     </EntityAttributes> 
    </EntityNode> 
    ... 
</MyRoot> 

任何建議?

問候

回答

1

使用列別名來代替root()子查詢指定元素名稱。這將使Value1Value2以與SubValue相同的節點結束。

SQL Fiddle

MS SQL Server 2008的架構設置

create table Entity_A 
(
    ID int, 
    Name varchar(10), 
    Description varchar(20), 
    Value1 varchar(10), 
    Value2 varchar(10) 
); 

create table Entity_B 
(
    ID int, 
    ID_Entity_A int, 
    SubValue char(3) 
); 

insert into Entity_A values 
(10, 'aName1', 'aDescription1', 'AttVal1', 'AttVal2'), 
(11, 'aName2', 'aDescription2', 'AttVal21', 'AttVal25'); 

insert into Entity_B values 
(1,  10,   'sv1'), 
(2,  10,   'sv2'), 
(3,  10,   'sv3'), 
(4,  10,   'sv4'), 
(5,  11,   'sv5'), 
(6,  11,   'sv6'); 

查詢1

select A.Name as [Identification/Name], 
     A.Description as [Identification/Description], 
     A.Value1 as [EntityAttribute/Value1], 
     A.Value2 as [EntityAttribute/Value2], 
     (
     select B.SubValue 
     from dbo.Entity_B as B 
     where A.ID = B.ID_Entity_A 
     for xml path(''), type 
     ) as [EntityAttribute] 
from dbo.Entity_A as A 
for xml path('EntityNode'), root('MyRoot'); 

Results

<MyRoot> 
    <EntityNode> 
    <Identification> 
     <Name>aName1</Name> 
     <Description>aDescription1</Description> 
    </Identification> 
    <EntityAttribute> 
     <Value1>AttVal1</Value1> 
     <Value2>AttVal2</Value2> 
     <SubValue>sv1</SubValue> 
     <SubValue>sv2</SubValue> 
     <SubValue>sv3</SubValue> 
     <SubValue>sv4</SubValue> 
    </EntityAttribute> 
    </EntityNode> 
    <EntityNode> 
    <Identification> 
     <Name>aName2</Name> 
     <Description>aDescription2</Description> 
    </Identification> 
    <EntityAttribute> 
     <Value1>AttVal21</Value1> 
     <Value2>AttVal25</Value2> 
     <SubValue>sv5</SubValue> 
     <SubValue>sv6</SubValue> 
    </EntityAttribute> 
    </EntityNode> 
</MyRoot> |