Какой тип SQL-соединения мне нужен, чтобы сжать отношение «один ко многим» в одну строку представления? - PullRequest
1 голос
/ 02 февраля 2011

Редактировать: это не динамический вывод, структура представления вывода фиксирована.

Я пытаюсь создать представление SQL Server, которое отображает одну фиксированную строку столбца для каждого пользователя и выравнивает таблицу, связанную с несколькими, в эту строку.

Хотя связанная таблица имеет отношение один ко многим, структура выходной таблицы ограничена 4 элементами из этой таблицы.

Моя структура таблицы выглядит так:

User (Id, FirstName, LastName)
Assessment (Id, Date, Location, User_Id)
Topics (Id, Topic, Assessment_Id)

Когда оценка присоединяется к пользователю с помощью идентификатора пользователя (один 2 один), а темы присоединяются к оценке с помощью идентификатора оценки.

Итак, если у меня есть три темы для оценки, я бы хотел, чтобы представление выглядело примерно так:

User_Id | FirstName | LastName | Date   | Location | Topic1 | Topic2  | Topic3 | Topic4 |
    1   |  dave     |  toby    | 2/2/11 | In situ  | apples | pears   | lemons | NULL   |

Мой текущий SQL выглядит так:

SELECT  User.Id, User.FirstName, User.LastName, Assessment.Date, Assessment.Location, Topic.Topic
FROM   User LEFT OUTER JOIN
           Assessment INNER JOIN
              Topic ON Assessment.Id = Topic.Assessment_Id ON 
                  User.Id = Assessment.User_Id

Но это возвращает строку для каждой проблемы - она ​​не сжимает их до одной строки. Я играл с несколькими разными объединениями, но не смог добиться желаемого поведения.

Возможно ли сделать это в виде?
Что мне нужно сделать, чтобы это произошло ??

Спасибо!

Ответы [ 2 ]

3 голосов
/ 02 февраля 2011

Нет такого JOIN. SQL имеет фиксированный вывод столбцов: поэтому вы не можете добавлять произвольные номера столбцов. Не имеет значения, является ли это представлением, прямым или хранимой процедурой.

Есть 2 основных варианта

  1. объединить много строк в один столбец , что является популярным вопросом здесь, на SO. Одно случайное решение с использованием XML PATH

  2. использование динамического SQL для добавления столбца на строку в хранимой процедуре .

Примечание: PIVOT также является фиксированным выходом столбца

Редактировать: максимум 4 дочерних строки

SELECT 
  P.col1, P.col2,
  C1.col1 AS Topic1,
  C2.col1 AS Topic2,
  C3.col1 AS Topic2,
  C4.col1 AS Topic4
FROM
  Parent P
  LEFT JOIN
  Child C1 ON P.Key = C1.FKey AND C1.ID = 1
  LEFT JOIN
  Child C2 ON P.Key = C2.FKey AND C2.ID = 2
  LEFT JOIN
  Child C3 ON P.Key = C3.FKey AND C3.ID = 3
  LEFT JOIN
  Child C4 ON P.Key = C4.FKey AND C4.ID = 4

Вы также можете использовать PIVOT, но я предпочитаю более простые самостоятельные соединения.

2 голосов
/ 02 февраля 2011

Посмотрите на функциональность таблицы PIVOT - например, http://www.help -sql.info / 27/9 / 610208.html и http://blog.sqlauthority.com/2008/05/22/sql-server-pivot-table-example/

Хотя вам необходимо знатьAssessmentId, прежде чем вы сможете написать PIVOT

...