Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在一个XML节点中分组一对多数据-SQL Server_Sql Server_Xml_Sql Server 2008 - Fatal编程技术网

Sql server 如何在一个XML节点中分组一对多数据-SQL Server

Sql server 如何在一个XML节点中分组一对多数据-SQL Server,sql-server,xml,sql-server-2008,Sql Server,Xml,Sql Server 2008,表之间存在一对多关系,一个检查器可以有许多文档,我喜欢按检查器id对它们进行分组,并在一个xml节点中显示它们 到目前为止,我已经尝试过了 SQL: select d.InspectorID "@InspectorID", d.DocID "Qualification/DocID", d.FileSize "Qualification/FileSize", q.Name "Qualification/Name", d.EndDate "Qua

表之间存在一对多关系,一个检查器可以有许多文档,我喜欢按检查器id对它们进行分组,并在一个xml
节点中显示它们

到目前为止,我已经尝试过了

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
<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>
XML输出:

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
<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>

23107
248724
AWS CWI
2016-12-01T00:00:00
2014-07-23T21:30:00
23108
524934
其他
1900-12-12T00:00:00
2014-07-23T21:31:00
我如何实现这一期望输出:

<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>

23107
248724
AWS CWI
2016-12-01T00:00:00
2014-07-23T21:30:00
23108
524934
其他
1900-12-12T00:00:00
2014-07-23T21:31:00
试试这个:

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

下面的查询给出了您想要的结果。它使用单个表,但您可以根据需要调整它以适应表+连接

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>

23107
248724
AWS CWI
2016-12-01T00:00:00
2014-07-23T21:30:00
23108
524934
其他
1900-12-12T00:00:00
2014-07-23T21:30:00