2009-07-31 15 views
3

親テーブルと2つ以上の子テーブルを持つデータベーススキーマを指定します。たとえば:SQL Serverで複数テーブルの結合からXMLを作成する

Database Diagram

それは、次のXMLを出力for 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> 

コンタクトテーブルまたはアドレステーブルのいずれかに1回の左結合を使用すると、後の処理の一部が生成されますが、2回目の結合を追加すると、間違って開始されます。私が探している結果を達成するために使用できる別のテクニックがありますか?

答えて

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

FYI ...私は信じている "XMLパスは、" SQL 2008 – David

+0

@デビッド必要です:いいえ、それは2005' '上で動作します。 http://msdn.microsoft.com/en-us/library/ms189885(SQL.90).aspx – Quassnoi

+0

ありがとう@Quassnoi、それは治療を働く! –

関連する問題