Проблема с вложенным выводом SQL в XML

#sql #sql-server #xml #sql-server-2008

#sql #sql-сервер #xml #sql-server-2008

Вопрос:

У меня проблема с форматированием при выводе SQL в XML.

Следующее работает так, как ожидалось:-

 SELECT 
   AC.ACCOUNT AS 'Acct',
   (SELECT ITEMNO AS 'ITEM' 
   FROM ITEMS AS ITEMS1 WITH(NOEXPAND) 
   WHERE ITEMS1.CODE = AC.CODE
   FOR XML PATH ('Items'), TYPE)
FROM 
   AC WITH(NOLOCK) 
INNER JOIN 
   ITEMS ON AC.CODE = ITEMS.CODE
FOR XML PATH (''), ROOT ('Accts'), ELEMENTS
  

Который выводит следующий XML:

 <Accts>
   <Acct>94615130</Acct>
   <Items>
      <ITEM>1001</ITEM>
   </Items>
   <Items>
      <ITEM>1050</ITEM>
   </Items>
   <Items>
      <ITEM>1051</ITEM>
   </Items>
   <Items>
      <ITEM>1054</ITEM>
   </Items>
   <Items>
      <ITEM>1055</ITEM>
   </Items>
   ....
</Accts>
  

Но когда я добавляю дополнительное предложение в where подзапроса, подобного этому:

      SELECT 
     AC.ACCOUNT AS 'Acct',
     (SELECT ITEMNO AS 'ITEM' 
     FROM ITEMS AS ITEMS1 WITH(NOEXPAND) 
     WHERE ITEMS1.CODE = AC.CODE
     AND ITEMS1.ITEMNO = ITEMS.ITEMNO
     FOR XML PATH ('Items'), TYPE)
FROM 
     AC WITH(NOLOCK) 
INNER JOIN 
     ITEMS ON AC.CODE = ITEMS.CODE
FOR XML PATH (''), ROOT ('Accts'), ELEMENTS
  

Я получаю этот вывод xml:

 <Accts>
   <Acct>94615130</Acct>
   <Items>
      <ITEM>28</ITEM>
   </Items>
   <Acct>94615130</Acct>
   <Items>
       <ITEM>36</ITEM>
   </Items>
   <Acct>94615130</Acct>
   <Items>
      <ITEM>114</ITEM>
   </Items>
   <Acct>94615130</Acct>
   <Items>
      <ITEM>161</ITEM>
   </Items>
   ....
</Accts>
  

это не то, чего я хочу. Мне нужно, чтобы все элементы были сгруппированы по номеру счета, как в первом примере, а не повторяли номер счета для каждого элемента.

Я использую Microsoft SQL Server 2008, любая помощь приветствуется.

Ответ №1:

Я думаю, вам нужно избавиться от внутреннего соединения в вашем внешнем запросе. ie:

 SELECT 
   AC.ACCOUNT AS 'Acct',
   (SELECT ITEMNO AS 'ITEM' 
   FROM ITEMS AS ITEMS1 
   WHERE ITEMS1.CODE = AC.CODE
   FOR XML PATH ('Items'), TYPE)
FROM 
   AC 
FOR XML PATH (''), ROOT ('Accts'), ELEMENTS
  

Комментарии:

1. Спасибо за ответ. Причина объединения заключается в том, что я могу сопоставлять Code и ItemNo в предложении where подзапроса, поскольку сопоставление только по коду недостаточно уникально.

2. @user1319501 Но это описано во внутреннем XML, нет?

3. @user1319501 select .. as Item xml

4. Мне нужно, чтобы предложение where было таким:- ГДЕ ITEMS1.CODE = AC.CODE И ITEMS1.ITEMNO = ITEMS. Очевидно, именно поэтому у меня было внутреннее соединение во внешнем запросе. Добавление этого дополнительного предложения в where, однако, повторяет номер учетной записи для каждого номера элемента в xml