2009-12-11 53 views
1

說我有這樣的設置:FOR XML EXPLICIT

-- tables 
declare @main table (id int, name varchar(20)) 
declare @subA table (id int, mid int, name varchar(20)) 
declare @subA1 table (id int, subAid int, name varchar(20)) 
declare @subA2 table (id int, subAid int, name varchar(20)) 
declare @subB table (id int, mid int, name varchar(20)) 

-- sample data 
insert @main values (1, 'A') 
insert @main values (2, 'B') 
insert @SubA values (1, 1, 'A') 
insert @SubA values (2, 1, 'B') 
insert @SubA values (3, 2, 'C') 
insert @SubA1 values (1, 1, 'A') 
insert @SubA2 values (1, 2, 'A') 
insert @SubB values (1, 1, 'A') 
insert @SubB values (2, 1, 'B') 
insert @SubB values (3, 2, 'C') 

-- results 
select m.id, m.name, a.name, a1.name, a2.name, b.name 
from @main m 
left outer join @SubA a on m.id = a.mid 
left outer join @SubA1 a1 on a.id = a1.subAid 
left outer join @SubA2 a2 on a.id = a2.subAid 
left outer join @SubB b on m.id = b.mid 

這將返回:

1 A A A NULL A 
1 A A A NULL B 
1 A B NULL A A 
1 A B NULL A B 
2 B C NULL NULL C 

如果我使用 「FOR XML AUTO」 然後我得到:

<m id="1" name="A"> 
    <a name="A"> 
    <a1 name="A"> 
     <a2> 
     <b name="A" /> 
     <b name="B" /> 
     </a2> 
    </a1> 
    </a> 
    <a name="B"> 
    <a1> 
     <a2 name="A"> 
     <b name="A" /> 
     <b name="B" /> 
     </a2> 
    </a1> 
    </a> 
</m> 
<m id="2" name="B"> 
    <a name="C"> 
    <a1> 
     <a2> 
     <b name="C" /> 
     </a2> 
    </a1> 
    </a> 
</m> 

然而,這不是我所需要的。我想展示的是@main是有兩個孩子的主表:@subA和@SubB。 @SubA反過來也有兩個孩子:@ SubA1和@ SubA2,所以我想回去:

<m id="1" name="A"> 
    <a name="A"> 
    <a1 name="A"></a1> 
    <a2></a2>  
    </a> 
    <a name="B"> 
    <a1></a1> 
    <a2 name="A"></a2>  
    </a> 
    <b name="A" /> 
    <b name="B" /> 
</m> 
<m id="2" name="B"> 
    <a name="C"> 
    <a1></a1> 
    <a2></a2>  
    </a> 
    <b name="C" /> 
</m> 

我敢肯定,我將不得不使用「用於XML明確的」,但出來的到目前爲止,我嘗試過的所有嘗試都無法獲得我需要的格式。

任何人都可以顯示一個示例查詢,將返回所需格式的數據?

謝謝, 馬克

+0

您正在使用什麼版本的SQL Server? SQL Server 2005及以上有FOR XML PATH這比EXPLICIT容易得多.... – 2009-12-11 19:19:21

+0

我不能保證它將在2005+盒子上,因爲仍有一些人在2000年運行它,所以它必須適用於這兩個平臺。另外,我不認爲FOR XML PATH會給我產生上面列出的輸出所需的靈活性。雖然我很高興被證明是錯誤的! – ca8msm 2009-12-13 21:53:29

回答

2

您也可以重新寫入查詢來控制XML輸出,谷歌nested FOR XML QUERY。這裏是一個使用FOR XML AUTO的例子,用FOR XML PATH可以更好的控制這個技巧。

-- tables 
declare @main table (id int, name varchar(20)) 
declare @subA table (id int, mid int, name varchar(20)) 
declare @subA1 table (id int, subAid int, name varchar(20)) 
declare @subA2 table (id int, subAid int, name varchar(20)) 
declare @subB table (id int, mid int, name varchar(20)) 

-- sample data 
insert @main values (1, 'm(1)') 
insert @main values (2, 'm(2)') 
insert @SubA values (1, 1, 'm(1)/a(1)') 
insert @SubA values (2, 1, 'm(1)/a(2)') 
insert @SubA values (3, 2, 'm(2)/a(3)') 
insert @SubA1 values (1, 1, 'a(1)/a1(1)') 
insert @SubA2 values (1, 1, 'a(1)/a2(1)') 
insert @SubA2 values (2, 2, 'a(2)/a2(2)') 
insert @SubB values (1, 1, 'm(1)/b(1)') 
insert @SubB values (2, 1, 'm(1)/b(2)') 
insert @SubB values (3, 2, 'm(2)/b(3)') 

SELECT m.id 
     ,m.name 
     ,(SELECT [name] 
        ,(SELECT [name] 
         FROM  @subA1 AS a1 
         WHERE  a1.subAid = a.id 
        FOR XML AUTO, TYPE 
        ) 
        ,(SELECT [name] 
         FROM  @subA2 AS a2 
         WHERE  a2.subAid = a.id 
        FOR XML AUTO, TYPE 
        ) 
      FROM  @SubA AS a 
      WHERE  m.id = a.mid 
     FOR XML AUTO, TYPE 
     ) 
     ,(SELECT [name] 
      FROM  @SubB AS b 
      WHERE  m.id = b.mid 
     FOR XML AUTO, TYPE 
     ) 
FROM @main AS m 
FOR XML AUTO 

返回:

<m id="1" name="m(1)"> 
    <a name="m(1)/a(1)"> 
    <a1 name="a(1)/a1(1)" /> 
    <a2 name="a(1)/a2(1)" /> 
    </a> 
    <a name="m(1)/a(2)"> 
    <a2 name="a(2)/a2(2)" /> 
    </a> 
    <b name="m(1)/b(1)" /> 
    <b name="m(1)/b(2)" /> 
</m> 
<m id="2" name="m(2)"> 
    <a name="m(2)/a(3)" /> 
    <b name="m(2)/b(3)" /> 
</m> 
+0

謝謝。就原始的sql語句而言,它有點「凌亂」,但它確實提供了我想要的輸出,所以這可能是我最後的結果。 – ca8msm 2009-12-13 21:56:59

+0

不幸的是,我將無法使用這種方法。可能有多個從查詢返回的「A1」記錄,並且不能將多行作爲嵌套子查詢的一部分返回。 – ca8msm 2009-12-14 15:58:29