Update таблицы через сложный select + сравнение результата. MSSQL

На данный момент мой скрипт Update выглядит так.

UPDATE [dbo].[myTable]
SET [isOnlyProgrammerRoles] = CAST (CASE WHEN UserName like '%[^0-9]%' then 0  
else 1 end AS BIT)

Теперь нужно обновление сделать по следующему порядку.

  1. Cделать селект(перехватил его через entity framework profiler т.к. я такой запрос не написал бы, соответственно в селекте много ненужных символов)

    SELECT [c.MySiteRole].[Id],
    [c.MySiteRole].[EmployeeId],
    [c.MySiteRole].[RoleId],
    [c.MySiteRole].[SiteId],
    [e.Site].[Id],
    [e.Role].[Id],
    [e.Role].[Name],
    [e.Role].[RoleTypeId]
    FROM   [MySiteRole] AS [c.MySiteRole]
    INNER JOIN [Site] AS [e.Site]
      ON [c.MySiteRole].[SiteId] = [e.Site].[Id]
    INNER JOIN [Role] AS [e.Role]
      ON [c.MySiteRole].[RoleId] = [e.Role].[Id]
    INNER JOIN (SELECT TOP(1) [c1].[Id]
                FROM   [Employee] AS [c1]
                WHERE  [c1].[UserName] = 'testusername'
                ORDER  BY [c1].[Id]) AS [t0]
      ON [c.MySiteRole].[EmployeeId] = [t0].[Id]
    ORDER  BY [t0].[Id],
       [e.Role].[Id]
    
  2. По результату селекта у меня будет выборка где есть поле RoleId. И я должен сравнить каждый RoleId с зарание заготовлеными GuidId. Их у меня 5 штук, ну для примера возмем две - FirstGuidId, SecondGuidId.

  3. Если в результате селекта все исключительно RoleId совпадают с FirstGuidId или SecondGuidId то полю isOnlyProgrammerRoles поставить bit 1. Простылми слова названия поля говорит само за себя. Должны быть только роли для програмиста, если по результату селекта будет хотя бы одна другая роль которая не совпадает с нашими FirstGuidId, SecondGuidId, например скрам мастера, то уже полю isOnlyProgrammerRoles присвоить bit 0. Как организовать такой Update?


Ответы (1 шт):

Автор решения: Aziz Umarov

Ну если я всё верно понял то вам нужен запрос на update myTable

Можно так

UPDATE [dbo].[myTable]
SET [isOnlyProgrammerRoles] = CAST (CASE WHEN Exists (select * from [MySiteRole] AS [c.MySiteRole] 
INNER JOIN [Site] AS [e.Site]
  ON [c.MySiteRole].[SiteId] = [e.Site].[Id]
INNER JOIN [Role] AS [e.Role]
  ON [c.MySiteRole].[RoleId] = [e.Role].[Id]
INNER JOIN (SELECT TOP(1) [c1].[Id]
            FROM   [Employee] AS [c1]
            WHERE  [c1].[UserName] = 'testusername' 
            ORDER  BY [c1].[Id]) AS [t0]
  ON [c.MySiteRole].[EmployeeId] = [t0].[Id] Where [c.MySiteRole].[RoleId] not in (ваш список id developers)) then 0  
else 1 end AS BIT)

Я предполагаю что программисты всегда есть. И только наличие не только девелоперов вам даст нужный ответ.

→ Ссылка