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