2

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

  1. 公司
  2. 部门
  3. 员工在部门

我想要一个如下的xml:

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

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

关系

  1. CompanyDepartment通过链接到FK表中的表中相关。DepartmentCompanyIdCompany

  2. Department并通过链接到表中的表中的EmployeeInDepartment“FK”相关联。EmployeeInDepartmentDepartmentIdDepartment

询问:

在 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')
4

2 回答 2

3

你需要做“嵌套”的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,它展示了如何做到这一点。当然,您可以轻松嵌套两层以上......

于 2012-01-18T12:58:43.707 回答
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过滤子查询中的行的 where 子句查询所需的信息,因此您只能在子节点中获得所需的行。

于 2012-01-18T15:31:37.433 回答