2009-07-31 18 views
3

給定一個具有父表和兩個或多個子表的數據庫模式。例如:從SQL Server中的多表連接生成XML

Database Diagram

是否有可能創建一個查詢,使用for xml聲明,輸出下面的XML:

<?xml version="1.0"?> 
<person> 
    <name>Joe Bloggs</name> 
    <age>25</age> 
    <address> 
     <streetAddress>123 Test Street</streetAddress> 
     <town>Example Town</town> 
     <postcode>A12 3BC</postcode> 
    </address> 
    <address> 
     <streetAddress>124 Test Street</streetAddress> 
     <town>Example Town</town> 
     <postcode>A12 3BC</postcode> 
    </address> 
    <contact> 
     <type>Home Phone</type> 
     <value></value> 
    </contact> 
    <contact> 
     <type>Work Phone</type> 
     <value>01987 654321</value> 
    </contact> 
    <contact> 
     <type>Email Address</type> 
     <value>[email protected]</value> 
    </contact> 
</person> 

我的初步嘗試:

select person.name, person.age, 
     address.streetAddress, address.town, address.postcode, 
     contact.type, contact.value 
    from Person as person 
     left join Address as address on person.PersonID = address.PersonID 
     left join Contact as contact on person.PersonID = contact.PersonID 
    where person.PersonID = 1 
    for xml auto, elements 

墓內這個結果是所有聯繫人和地址的組合都被輸出:

<?xml version="1.0" encoding="utf-8"?> 
<person> 
    <name>Joe Bloggs</name> 
    <age>25</age> 
    <address> 
     <streetAddress>123 Test Street</streetAddress> 
     <town>Example Town</town> 
     <postcode>A12 3BC</postcode> 
     <contact> 
      <type>Home Phone</type> 
      <value></value> 
     </contact> 
     <contact> 
      <type>Work Phone</type> 
      <value>01987 654321</value> 
     </contact> 
     <contact> 
      <type>Email Address</type> 
      <value>[email protected]</value> 
     </contact> 
    </address> 
    <address> 
     <streetAddress>124 Test Street</streetAddress> 
     <town>Example Town</town> 
     <postcode>A32 1BC</postcode> 
     <contact> 
      <type>Home Phone</type> 
      <value></value> 
     </contact> 
     <contact> 
      <type>Work Phone</type> 
      <value>01987 654321</value> 
     </contact> 
     <contact> 
      <type>Email Address</type> 
      <value>[email protected]</value> 
     </contact> 
    </address> 
</person> 

使用單一的左連接到無論是聯繫人或地址表產生的就是我以後的部分,但加入第二個連接後,它開始出問題。是否有另一種技術可以用來實現我期待的結果?

回答

13
SELECT person.name, person.age, 
     (
     SELECT address.streetAddress, address.town, address.postcode 
     FROM Address as address 
     WHERE person.PersonID = address.PersonID 
     FOR XML PATH('ADDRESS'), TYPE 
     ), 
     (
     SELECT contact.type, contact.value 
     FROM Contact as contact 
     WHERE person.PersonID = contact.PersonID 
     FOR XML PATH('CONTACT'), TYPE 
     ), 
FROM Person as person 
WHERE person.PersonID = 1 
FOR XML AUTO, ELEMENTS 
+0

僅供參考......我相信 「XML路徑」 需要SQL 2008 – David 2009-07-31 16:38:53