Как мне сгенерировать вложенный XML для отношения «многие ко многим» в sql server 2008?

#sql #sql-server #xml #sql-server-2008

#sql #sql-server #xml #sql-server-2008

Вопрос:

Ситуация такова, что есть курсы и лекторы, и у них есть отношения «многие ко многим» (на 1 курсе может быть много лекторов, 1 лектор может преподавать много курсов)

Следующий XML повторяет название курса:

 SELECT
    C.COURSE_ID "@course_id"
    ,   C.COURSE_NAME "Course_Name"
    --get lecturer id(s) of the course
    ,   CL.LECTURER_ID  

    FROM 
    COURSE C LEFT JOIN COURSE_LECTURER CL ON C.COURSE_ID = CL.COURSE_ID
    --LEFT JOIN AS ALL COURSES DON'T HAVE LECTURERS COULD BE INNER :)
FOR XML PATH('Course'), ROOT('Program')
  

Это дает мне следующий вывод (фрагмент):

 <Course course_id="ISFND 1.1">
    <Course_Name>Relational Databases and SQL</Course_Name>
    <LECTURER_ID>ME123</LECTURER_ID>
  </Course>
  <Course course_id="ISFND 1.1">
    <Course_Name>Relational Databases and SQL</Course_Name>
    <LECTURER_ID>HS123</LECTURER_ID>
  </Course>
  

Но результат, который я хочу, это:

 <Course course_id="ISFND 1.1">
        <Course_Name>Relational Databases and SQL</Course_Name>
        <LECTURER_ID>ME123</LECTURER_ID>
        <LECTURER_ID>HS123</LECTURER_ID>
      </Course>
  

Я предполагаю, что в моем sql есть какая-то проблема для «многие ко многим», возможно, мне нужно использовать IN или что-то подобное для каждого. Буду признателен за любую помощь. Спасибо.

Комментарии:

1. Course_Lecturer — это таблица отношений между курсом и лектором, поскольку это отношение «многие ко многим».

Ответ №1:

 SELECT
    C.COURSE_ID "@course_id"
    ,   C.COURSE_NAME "Course_Name"
    , (SELECT CL.LECTURER_ID
       FROM COURSE_LECTURER CL
       WHERE C.COURSE_ID = CL.COURSE_ID
       FOR XML PATH(''), TYPE)
FROM COURSE C
FOR XML PATH('Course'), ROOT('Program')