Update таблицы через сложный select + сравнение результата. MSSQL
На данный момент мой скрипт Update выглядит так.
UPDATE [dbo].[myTable]
SET [isOnlyProgrammerRoles] = CAST (CASE WHEN UserName like '%[^0-9]%' then 0
else 1 end AS BIT)
Теперь нужно обновление сделать по следующему порядку.
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]По результату селекта у меня будет выборка где есть поле
RoleId. И я должен сравнить каждыйRoleIdс зарание заготовлеными GuidId. Их у меня 5 штук, ну для примера возмем две - FirstGuidId, SecondGuidId.Если в результате селекта все исключительно
RoleIdсовпадают с FirstGuidId или SecondGuidId то полюisOnlyProgrammerRolesпоставить bit 1. Простылми слова названия поля говорит само за себя. Должны быть только роли для програмиста, если по результату селекта будет хотя бы одна другая роль которая не совпадает с нашими FirstGuidId, SecondGuidId, например скрам мастера, то уже полюisOnlyProgrammerRolesприсвоить bit 0. Как организовать такой Update?
Ответы (1 шт):
Ну если я всё верно понял то вам нужен запрос на 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)
Я предполагаю что программисты всегда есть. И только наличие не только девелоперов вам даст нужный ответ.