TSQL使用xml在子查询中区别

时间:2015-10-19 19:04:53

标签: sql-server stored-procedures sql-server-2012

我有以下表结构:

表1 - 可能的地区/市场选择清单

Region  |  Market
--------+----------------
EMEA    |  London
NA      |  Omaha
EMEA    |  Another City

表2 - 保留被选为影响的市场

RequestID   |  Market
------------+----------------
123         | London
123         | Omaha
456         | Another City

在我的存储过程中,我正在尝试根据Table2创建一个受影响的区域/市场列表。最终结果将是一个独特的区域列表,其中所有市场都受到影响。

在这种情况下,EMEA区域会产生两种影响,但我不希望EMEA出现两次。

当我在单个请求中执行此操作时,我能够创建临时表并将数据插入其中,然后完成我需要执行的操作。但是,这是拉动所有结果,我需要在查询中执行此操作,我不知道如何...

如果我没有从中获取不同的数据,此代码可以正常工作。否则,它会抛出错误:

  

无法将xml数据类型选为DISTINCT,因为它无法比较。

我是否可以通过其他方式在子查询/子选择中完成此操作?

 ...
 (SELECT DISTINCT 
      region,
      (SELECT m.market
       FROM dbo.bs_ToolRequests_MarketOptions AS m
       INNER JOIN dbo.BS_ToolRequests_ImpactedMarkets AS ma ON ma.market = m.market
       WHERE m.region = mo.region
         AND ma.requestID = t.requestID
       FOR XML PATH ('options'), TYPE, ELEMENTS, ROOT ('markets'))
  FROM   
      dbo.BS_ToolRequests_MarketOptions AS mo
  FOR XML PATH ('regions'), TYPE, ELEMENTS, ROOT ('impactedMarkets')),

预期结果:

<impactedMarkets>
  <regions>
    <region>EMEA</region>
    <markets>
       <options>
         <market>London</market>
       </options>
       <options>
         <market>Another City</market>
       </options>
     </markets>
  </regions>
</impactedMarkets>

1 个答案:

答案 0 :(得分:0)

您可能需要在派生表的

的SELECT语句中使用DISTINCT关键字
 ...
 (SELECT region,
          (SELECT m.market
           FROM dbo.bs_ToolRequests_MarketOptions AS m
           INNER JOIN dbo.BS_ToolRequests_ImpactedMarkets AS ma ON ma.market = m.market
           WHERE m.region = mo.region
             AND ma.requestID = t.requestID
           FOR XML PATH ('options'), TYPE, ELEMENTS, ROOT ('markets'))
      FROM   
          (SELECT DISTINCT region FROM dbo.BS_ToolRequests_MarketOptions) AS mo
FOR XML PATH ('regions'), TYPE, ELEMENTS, ROOT ('impactedMarkets')),