Создать заявление об обновлении, использующее объединения или группы - PullRequest
0 голосов
/ 28 июня 2018

В рамках процедуры более крупного хранилища я пытаюсь написать команду SQL для обновления определенного поля значением, зависящим от определенных критериев. У меня проблема с соединением объединений с группами.

Имеются три таблицы, в начальной таблице хранится идентификатор основной записи в хранимой процедуре и содержится уникальное значение.

wrec_id
1
2
3
4

Вторая таблица может содержать записи, связанные с основной таблицей Work_id и действует как маршрут к таблице персон. Если он не содержит значения или значение pers_id установлено на 0, тогда мне нужно «Не назначено» в качестве имени пользователя. Если было выделено более одного человека, мне нужен объединенный список всех людей.

wrec_id,  pers_id
1,          1
1,          2
2,          1
3,          3

Таблица Person содержит записи, необходимые для хранимой процедуры.

pers_id,    Forename,   Surname
1,             For1,        Sur1
2,             For2,        Sur2
3,             For3,        Sur3

Результат, ожидаемый для приведенных выше примеров, должен выглядеть следующим образом: -

For1 Sur1 : For2 Sur2
For1 Sur1
For3 Sur3
Not Assigned

Я безуспешно пробовал различные комбинации групп и объединений.
Любая помощь приветствуется.

1 Ответ

0 голосов
/ 28 июня 2018

В SQL Server вы можете использовать выражение XML PATH для объединения нескольких строк. В этом случае вы можете использовать что-то вроде запроса здесь , чтобы показать людей, назначенных для каждого рабочего проекта. Затем, в зависимости от того, как вам нужно использовать данные, вы можете обработать их либо в SQL Server, либо в вызывающем приложении. Например, если вы собираетесь показывать конечные результаты только в том виде, в каком они есть в вызывающем приложении, вы можете использовать XSLT для отображения XML так, как вам нужно (если вы идете по этому пути, вы можете заключить весь запрос в FOR XML выражение и отображайте его так, как вы хотели).

Если вам абсолютно необходимо отобразить данные в том виде, как они есть в SQL Server, вы можете вместо этого сделать что-то вроде этого:

select
  wrec_id
  ,case
    when
    (    select
            ' : ' + Persons.Forename + ' ' + Persons.Surname
        from WorkAssignments
          inner join Persons on
            Persons.pers_id = WorkAssignments.pers_id
        where
          WorkAssignments.wrec_id = WorkProjects.wrec_id
        for xml path('')
    ) is null then 'Not Assigned'
    else
        (    select
            ' : ' + Persons.Forename + ' ' + Persons.Surname
        from WorkAssignments
          inner join Persons on
            Persons.pers_id = WorkAssignments.pers_id
        where
          WorkAssignments.wrec_id = WorkProjects.wrec_id
        for xml path('')
    )
  end AssignedPersons
from WorkProjects

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...