2017-01-07 5 views
0

Google Maps 응용 프로그램의 실제 데이터가 필요하다고 생각하는 Northwind를 SQL 모델로 사용하고 있습니다. 나는 쿼리가 제대로 작동하고 있다고 생각하지만, XML로 리턴 될 때 계층 구조는 내가 필요로하는 방식이 아니다. 여기 FROM 절의 하위 쿼리로 인해 FOR XML AUTO 출력에서 ​​원하지 않는 요소가 발생합니다.

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는 주문과 고객 모두에 있기 때문에 애매 모호하기 때문에 필요로하는 것 같습니다. 나는로만 오 마커를 표시하는 방법을 알고 싶습니다 조롱 업 아래 :

<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

일반적으로, 나는 항상 조금 "쿨러"를 영업 이익으로 하위 쿼리를 사용하지만 같은 댓글을 달았 생각했습니다 같은 XML을 생성 @DVT에서 CTE 아이디어 그래서 나는 다시 썼다. 원하는대로 하위 쿼리를 피하고 임시 테이블을 채우기, 나는이 XML 계층 구조의 요소를 얻을 수있었습니다 : 당신의 CTE 아이디어에

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

감사합니다 (I는 ... - 공부까지 해당에 필요)하지만 코드 위에서 제공 한 것과 똑같은 [원하지 않는] XML 계층 구조를 생성합니다. –