一个包含2个表的简单示例:
SELECT
dbo.SalesOrder.SupplementaryReference AS SupplementaryReference,
dbo.SalesOrder.Address AS Address,
dbo.SalesOrder.Address2 AS Address2,
dbo.SalesOrder.CardCode AS CardCode,
dbo.SalesOrder.DocDate AS DocDate,
dbo.SalesOrder.DocDueDate AS DocDueDate,
dbo.SalesOrderLines.ItemCode AS ItemCode,
dbo.SalesOrderLines.Quantity AS Quantity
FROM
dbo.SalesOrderLines,
dbo.SalesOrder
WHERE
dbo.SalesOrderLines.SupplementaryReference = dbo.SalesOrder.SupplementaryReference
FOR XML AUTO, ELEMENTS, ROOT('root')
这会生成一个输出xml文档,如下所示:
<root>
<dbo.SalesOrder>
<Address>...</Address>
<Address2>...</Address2>
.....
.....
<dbo.SalesOrderLines>
<ItemCode>...</ItemCode>
<Quantity>...</Quantity>
</dbo.SalesOrderLines>
</dbo.SalesOrder>
</root>
这是我所期望的,但是我试图从3个表SalesOrder,SalesOrderLines和SalesOrderExpenses中获取XML文档,如下所述:
<root>
<dbo.SalesOrder>
<Address>...</Address>
<Address2>...</Address2>
.....
.....
<dbo.SalesOrderLines>
<ItemCode>...</ItemCode>
<Quantity>...</Quantity>
</dbo.SalesOrderLines>
<dbo.SalesOrderExpenses>
<BaseType>...</BaseType>
<ExpnsCode>...</ExpnsCode>
<LineTotal>...</LineTotal>
</dbo.SalesOrderExpenses>
</dbo.SalesOrder>
</root>
我尝试过以下查询:
SELECT
dbo.SalesOrder.SupplementaryReference AS SupplementaryReference,
dbo.SalesOrder.Address AS Address,
dbo.SalesOrder.Address2 AS Address2,
dbo.SalesOrder.CardCode AS CardCode,
dbo.SalesOrder.DocDate AS DocDate,
dbo.SalesOrder.DocDueDate AS DocDueDate,
dbo.SelesOrderExpenses.BasteType AS BaseType,
dbo.SelesOrderExpenses.ExpnsCode AS ExpnsCode,
dbo.SelesOrderExpenses.LineTotal AS LineTotal,
dbo.SalesOrderLines.ItemCode AS ItemCode,
dbo.SalesOrderLines.Quantity AS Quantity
FROM
dbo.SalesOrderLines,
dbo.SalesOrderExpenses,
dbo.SalesOrder
WHERE
dbo.SalesOrderLines.SupplementaryReference = dbo.SalesOrder.SupplementaryReference
FOR XML AUTO, ELEMENTS, ROOT('root')
然而我收到的这个输出将第三个表嵌在第二个表中:
<root>
<dbo.SalesOrder>
<Address>...</Address>
<Address2>...</Address2>
.....
.....
<dbo.SalesOrderExpenses>
<BaseType>...</BaseType>
<ExpnsCode>...</ExpnsCode>
<LineTotal>...</LineTotal>
<dbo.SalesOrderLines>
<ItemCode>...</ItemCode>
<Quantity>...</Quantity>
</dbo.SalesOrderLines>
</dbo.SalesOrderExpenses>
</dbo.SalesOrder>
</root>
那么任何想法? 谢谢你的时间。
答案 0 :(得分:1)
没有样本数据,提供建议有点困难,但您可能正在寻找类似的东西:
SELECT so.[Address]
,so.Address2
/*more columns*/
,(
SELECT sol.ItemCode
,sol.Quantity
FROM dbo.SalesOrderLines AS sol
WHERE so.SupplementaryReference =sol.SupplementaryReference
FOR XML PATH('dbo.SalesOrderLines'),TYPE --only one row???
) AS [node()]
,(
SELECT sol.ItemCode
,sol.Quantity
FROM dbo.SalesOrderExpenses AS soe
WHERE so.SupplementaryReference =soe.SupplementaryReference
FOR XML PATH('dbo.SalesOrderLines'),TYPE --only one row???
) AS [node()]
FROM dbo.SalesOrder AS so
顺便说一下:避免使用逗号添加表名的旧式连接,并在WHERE
子句中设置连接谓词。更好地使用适当的JOIN
。在这种情况下,这是INNER JOIN
...