2017-01-07 6 views
0

私はGoogle Mapsアプリケーションの実際のデータが必要になると思うので、Northwindを使用してSQLをモデル化しています。私はクエリが正常に動作していると思いますが、XMLで返された場合、階層は必要な方法ではありません。ここで FROM句のサブクエリがFOR XML AUTO出力で不要なELEMENTを引き起こしています

SELECT Marker.CustomerID 
    ,Marker.CompanyName 
    ,Marker.TotalAmount 
    ,o.OrderID 
    ,o.Freight 
FROM  
    (
      SELECT c.CustomerID 
      ,c.CompanyName 
      ,c.Address 
      ,COUNT(o.freight) as TotalOrders 
      ,SUM(o.freight) as TotalAmount 
      FROM  Customers c 
      INNER JOIN Orders o 
       ON c.CustomerID = o.CustomerID 
       where c.CustomerID = 'ALFKI' or c.CustomerID = 'ANTON' 
       group by c.CustomerID 
         ,c.CompanyName 
         ,c.Address 
    ) AS Marker       

    INNER JOIN Orders o 
     ON Marker.CustomerID = o.CustomerID 
where Marker.CustomerID = 'ALFKI' or Marker.CustomerID = 'ANTON' 
order by 1 
for xml auto, root('root') 

は、XMLが返されます。

<root> 
<c CustomerID="ALFKI" CompanyName="Alfreds Futterkiste"> 
<Marker TotalAmount="225.5800"> 
    <o OrderID="10643" Freight="29.4600" /> 
    <o OrderID="10692" Freight="61.0200" /> 
    <o OrderID="10702" Freight="23.9400" /> 
    <o OrderID="10835" Freight="69.5300" /> 
    <o OrderID="10952" Freight="40.4200" /> 
    <o OrderID="11011" Freight="1.2100" /> 
</Marker> 
</c> 
<c CustomerID="ANTON" CompanyName="Antonio Moreno Taquería"> 
<Marker TotalAmount="268.5200"> 
    <o OrderID="10365" Freight="22.0000" /> 
    <o OrderID="10507" Freight="47.4500" /> 
    <o OrderID="10535" Freight="15.6400" /> 
    <o OrderID="10573" Freight="84.8400" /> 
    <o OrderID="10677" Freight="4.0300" /> 
    <o OrderID="10682" Freight="36.1300" /> 
    <o OrderID="10856" Freight="58.4300" /> 
</Marker> 
</c> 
</root> 

顧客テーブルの別名としてCを使用してサブクエリがXMLで不要です。注文と顧客の両方にいるため、CustomerIDがあいまいなので、必要なようです。私は嘲笑アップとして下記マーカー内のみ Oを表示する方法を知りたい:

<root> 
<Marker CustomerID="ALFKI" CompanyName="Alfreds Futterkiste" TotalAmount="225.5800"> 
    <o OrderID="10643" Freight="29.4600" /> 
    <o OrderID="10692" Freight="61.0200" /> 
    <o OrderID="10702" Freight="23.9400" /> 
    <o OrderID="10835" Freight="69.5300" /> 
    <o OrderID="10952" Freight="40.4200" /> 
    <o OrderID="11011" Freight="1.2100" /> 
</Marker> 

答えて

0

通常、私はいつもOPのようにサブクエリを使用することがビット「クーラー」と思ってきたけどとしてコメントし、@DVTからCTEのアイデアは、次のように私は書き直し同じXMLを生成します。サブクエリを回避し、一時テーブルを移入することにより、私は、必要に応じてXMLの階層内の要素を取得することができた:

CREATE TABLE #TempMarkers 
(
    CustomerID nchar(5) NOT NULL, 
    CompanyName nvarchar(40) NOT NULL, 
    Address nvarchar(60) NULL, 
    TotalOrders int NULL, 
    TotalAmount money NULL 
) 
INSERT INTO #TempMarkers 
(CustomerID 
,CompanyName 
,Address 
,TotalOrders 
,TotalAmount 
) 
SELECT c.CustomerID 
     ,c.CompanyName 
     ,c.Address 
     ,COUNT(o.freight) as TotalOrders 
     ,SUM(o.freight) as TotalAmount 
     FROM  Customers c 
     INNER JOIN Orders o 
      ON c.CustomerID = o.CustomerID 
      where c.CustomerID = 'ALFKI' or c.CustomerID = 'ANTON' 
      group by c.CustomerID 
        ,c.CompanyName 
        ,c.Address 
SELECT Marker.CustomerID 
     ,Marker.CompanyName 
     ,Marker.TotalAmount 
     ,Marker.TotalOrders 
     ,o.OrderID 
     ,o.Freight 
FROM #TempMarkers Marker  
    INNER JOIN Orders o 
     ON Marker.CustomerID = o.CustomerID 
where Marker.CustomerID = 'ALFKI' or Marker.CustomerID = 'ANTON' 
order by 1 
for xml auto, root('root') 
-1

どうCTEの使用について。

WITH Marker AS (
    SELECT c.CustomerID 
    ,c.CompanyName 
    ,c.Address 
    ,COUNT(o.freight) as TotalOrders 
    ,SUM(o.freight) as TotalAmount 
    FROM  Customers c 
    INNER JOIN Orders o 
     ON c.CustomerID = o.CustomerID 
     where c.CustomerID = 'ALFKI' or c.CustomerID = 'ANTON' 
     group by c.CustomerID 
       ,c.CompanyName 
       ,c.Address 
) 
SELECT Marker.CustomerID 
,Marker.CompanyName 
,Marker.TotalAmount 
,o.OrderID 
,o.Freight 
FROM Marker       
INNER JOIN Orders o 
    ON Marker.CustomerID = o.CustomerID 
where Marker.CustomerID = 'ALFKI' or Marker.CustomerID = 'ANTON' 
order by 1 
for xml auto, root('root') 
+0

あなたのCTEのアイデアのおかげで(私はその上のアップを検討する必要があります。)が、コード上記で提供したのとまったく同じ[不要な] XML階層が生成されます。 –

関連する問題