【问题标题】:How to group one to many data in one XML node - SQL Server如何在一个 XML 节点中对一对多数据进行分组 - SQL Server
【发布时间】:2015-04-14 18:10:20
【问题描述】:

表格之间是一对多的关系,一个检查员可以有许多文档,我喜欢按检查员 ID 对它们进行分组,并在一个 xml <row> 节点中显示它们。

到目前为止我尝试过的就在这里;

SQL:

select 
    d.InspectorID  "@InspectorID", 
    d.DocID  "Qualification/DocID", 
    d.FileSize "Qualification/FileSize", 
    q.Name "Qualification/Name", 
    d.EndDate "Qualification/EndDate", 
    d.DateCreated "Qualification/DateCreated"
from 
    InspectorDocs d
LEFT JOIN 
    DocumentType dt on dt.DocumentTypeID = d.DocType
LEFT JOIN 
    QualificationType q on q.QualificationTypeID =  d.QualificationTypeID
WHERE  
    d.InspectorID = 6390 
FOR XML PATH

XML 输出:

<row InspectorID="6390">
    <Qualification>
        <DocID>23107</DocID>
        <FileSize>248724</FileSize>
        <Name>AWS CWI</Name>
        <EndDate>2016-12-01T00:00:00</EndDate>
        <DateCreated>2014-07-23T21:30:00</DateCreated>
    </Qualification>
</row>
<row InspectorID="6390">
    <Qualification>
        <DocID>23108</DocID>
        <FileSize>524934</FileSize>
        <Name>Other</Name>
        <EndDate>1900-12-12T00:00:00</EndDate>
        <DateCreated>2014-07-23T21:31:00</DateCreated>
    </Qualification>
</row>

我怎样才能达到这个期望的输出:

<row InspectorID="6390">
    <Qualification>
          <DocID>23107</DocID>
          <FileSize>248724</FileSize>
          <Name>AWS CWI</Name>
          <EndDate>2016-12-01T00:00:00</EndDate>
          <DateCreated>2014-07-23T21:30:00</DateCreated>
    </Qualification>
    <Qualification>
          <DocID>23108</DocID>
          <FileSize>524934</FileSize>
          <Name>Other</Name>
          <EndDate>1900-12-12T00:00:00</EndDate>
          <DateCreated>2014-07-23T21:31:00</DateCreated>
    </Qualification> 
</row>

【问题讨论】:

    标签: sql-server xml sql-server-2008


    【解决方案1】:

    试试这个:

    SELECT  d1.InspectorID "@InspectorID"
          , ( SELECT    d.DocID "Qualification/DocID"
                      , d.FileSize "Qualification/FileSize"
                      , q.Name "Qualification/Name"
                      , d.EndDate "Qualification/EndDate"
                      , d.DateCreated "Qualification/DateCreated"
              FROM      InspectorDocs d
                        LEFT JOIN DocumentType dt ON dt.DocumentTypeID = d.DocType
                        LEFT JOIN QualificationType q ON q.QualificationTypeID = d.QualificationTypeID
              WHERE     d.InspectorID = d1.InspectorID
            FOR
              XML PATH
                , TYPE
            )
    FROM    ( SELECT DISTINCT
                        InspectorID
              FROM      InspectorDocs
            ) d1
    WHERE   d1.InspectorID = 6390
    FOR     XML PATH
    

    【讨论】:

      【解决方案2】:

      以下查询给出了您想要的结果。它使用单个表,但您可以将其调整为您需要的表 + 连接。

      DECLARE @t TABLE(
          InspectorID INT,
          DocID INT,
          FileSize INT,
          Name VARCHAR(256),
          EndDate DATETIME,
          DateCreated DATETIME
      );
      
      INSERT INTO @t
          (InspectorID,DocID,FileSize,Name,EndDate,DateCreated)
      VALUES
          (6390,23107,248724,'AWS CWI','2016-12-01T00:00:00','2014-07-23T21:30:00'),
          (6390,23108,524934,'Other','1900-12-12T00:00:00','2014-07-23T21:30:00');
      
      DECLARE @SelectedID INT=6390;
      
      SELECT
          @SelectedID "@InspectorID",
          (
              SELECT
                  t.DocID "Qualification/DocID", 
                  t.FileSize "Qualification/FileSize", 
                  t.Name "Qualification/Name", 
                  t.EndDate "Qualification/EndDate", 
                  t.DateCreated "Qualification/DateCreated"
              FROM
                  @t AS t
              WHERE  
                  t.InspectorID=@SelectedID
              FOR XML PATH(''), TYPE
          )
      FOR XML PATH, TYPE;
      

      结果:

      <row InspectorID="6390">
        <Qualification>
          <DocID>23107</DocID>
          <FileSize>248724</FileSize>
          <Name>AWS CWI</Name>
          <EndDate>2016-12-01T00:00:00</EndDate>
          <DateCreated>2014-07-23T21:30:00</DateCreated>
        </Qualification>
        <Qualification>
          <DocID>23108</DocID>
          <FileSize>524934</FileSize>
          <Name>Other</Name>
          <EndDate>1900-12-12T00:00:00</EndDate>
          <DateCreated>2014-07-23T21:30:00</DateCreated>
        </Qualification>
      </row>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-17
        • 2021-06-18
        • 2019-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-24
        • 2022-11-15
        相关资源
        最近更新 更多