【问题标题】:SQL Server 2005 - TSQL For Xml query to get grouped departments and employeesSQL Server 2005 - TSQL For Xml 查询以获取分组的部门和员工
【发布时间】:2012-01-18 12:26:57
【问题描述】:

对于包含 3 个表的数据库:

  1. 公司
  2. 部门
  3. EmployeeInDepartment

我想要一个如下的xml:

<Companies>
  <Company>
    <CompanyName></CompanyName>
    <CompanyId></CompanyId>
    <..></..>
    <Departments>
       <Name></Name>
       <..></..>
       <Employees>
          <Employee>
             <FirstName></FirstName>
             <LastName></LastName>
             .. .. ..
          </Employee>
          .. .. ..
       </Employees>
    </Departments>
    .. .. ..
  </Company>
  .. .. .. 
</Companies>

在公司重复(标签)的地方,公司内部的部门在重复(标签),部门内部的员工在重复(标签)通过重复我的意思是这些元素的数量不止一个,而不是数据。

关系

  1. CompanyDepartment 通过 Department 表中的 FK 相关联,该表链接到 Company 表中的 CompanyId

  2. DepartmentEmployeeInDepartment 通过EmployeeInDepartment 表中的“FK”关联到Department 表中的DepartmentId

查询:

在 PUBS 数据库上执行以下操作并检查 xml,它将有多个 id 为 10 的作业

select jobs.job_id 'JobId',
job_desc 'Desc',
(
    select emp_id 'EmployeeId',fname 'FirstName',lname 'LastName' from employee where job_id = jobs.job_id for xml path('Emploees'),type
)
from jobs
inner join 
employee on  jobs.job_id = employee.job_id
for xml path('employees')

【问题讨论】:

  • 你应该使用for xml path,我想你会在here和这些samples中找到你需要的一切。
  • @MikaelEriksson 嗨,mikael,是的,我正在使用for xml path 模式,只是公司的部门没有按顺序排列(companyid = 1 的 3 条第一条记录,接下来是公司 id 2,接下来是公司 id 1) 所以当我运行查询时,我会得到 2 个具有相同公司 id 的公司标签。
  • 如果您可以发布您的查询,将会很有帮助。
  • @MikaelEriksson 我当然可以。抱歉,该图将在此过程中提供更多帮助。
  • 您的查询和您遇到的问题的描述会将其变成一个问题。现在看起来更像是“有人可以帮我做这件事吗”:)。

标签: xml sql-server-2005 nested for-xml


【解决方案1】:

您需要执行“嵌套”FOR XML 语句 - 这应该会给您所需的内容。

SELECT
   (some 'Company' columns),
   (SELECT
       (some 'Department' columns),
       (SELECT
           (some 'Employee' columns),
        FROM dbo.EmployeeInDepartment e
        WHERE e.DepartmentId = d.DepartmentId
        FOR XML PATH('Employee'), TYPE
       ) AS 'Employees'
    FROM dbo.Department d
    WHERE d.CompanyId = c.CompanyId
    FOR XML PATH('Department'), TYPE
   ) AS 'Departments'
FROM dbo.Company c
FOR XML PATH('Company'), ROOT('Companies')

参见例如Richard Dingwall 的Nested FOR XML results with SQL Server 展示了如何做到这一点。当然,你可以轻松嵌套两层以上...

【讨论】:

    【解决方案2】:

    不完全确定你想要这个,但这应该给你一个开始。

    declare @jobs table
    (
      job_id int,
      job_desc varchar(10)
    )
    
    declare @employee table
    (
      emp_id int,
      fname varchar(10),
      lname varchar(10),
      job_id int
    )
    
    insert into @jobs values
    (1, 'Job 1'),
    (2, 'Job 2')
    
    insert into @employee values
    (1, 'first 1', 'last 1', 1),
    (2, 'first 2', 'last 2', 1),
    (3, 'first 3', 'last 3', 2)
    
    select employee.emp_id 'EmployeeId',
           employee.fname 'FirstName',
           employee.lname 'LastName',
           (
            select jobs.job_id 'JobId',
                   jobs.job_desc 'Desc'
            from @jobs jobs
            where jobs.job_id = employee.emp_id
            for xml path('jobs'),type        
           )
    from @employee employee
    for xml path('employees')
    

    结果:

    <employees>
      <EmployeeId>1</EmployeeId>
      <FirstName>first 1</FirstName>
      <LastName>last 1</LastName>
      <jobs>
        <JobId>1</JobId>
        <Desc>Job 1</Desc>
      </jobs>
    </employees>
    <employees>
      <EmployeeId>2</EmployeeId>
      <FirstName>first 2</FirstName>
      <LastName>last 2</LastName>
      <jobs>
        <JobId>2</JobId>
        <Desc>Job 2</Desc>
      </jobs>
    </employees>
    <employees>
      <EmployeeId>3</EmployeeId>
      <FirstName>first 3</FirstName>
      <LastName>last 3</LastName>
    </employees>
    

    您不应该在每个部分中加入所有表格。主查询仅查询根级别所需的信息,子查询仅使用 where 子句 where jobs.job_id = employee.emp_id 查询所需的信息,该子查询过滤子查询中的行,因此您只能在子节点。

    【讨论】:

    • 这对我来说非常有效。select jobs.job_id 'JobId', job_desc 'Desc', ( select emp_id 'EmployeeId',fname 'FirstName',lname 'LastName' from employee where job_id = jobs.job_id for xml path('Employee'),type ) 'Employees' from jobs for xml path('employees')
    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 2013-03-22
    • 1970-01-01
    • 2023-03-27
    • 2010-11-06
    • 1970-01-01
    • 2013-07-09
    • 2014-07-04
    相关资源
    最近更新 更多