Не совсем уверен, как вы этого хотите, но это должно дать вам начало.
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
, которое фильтрует строки в подзапросах, так что вы получаете только те строки, которые вам нужны в дочерние узлы.