SQL-запрос, обновление из, многократное внутреннее соединение - PullRequest
2 голосов
/ 08 апреля 2019

допустим, у меня есть 3 таблицы в базе данных SQL:

AspNetUserRoles - содержит записи, которые связывают пользователя с ролью AspNetUsers - содержит пользователей AspNetRoles - содержит роли

Я хотел обновить роль, назначенную пользователю, чей адрес электронной почты: some@email.com

Я создал этот запрос, и он работает:

-- Update tester account role
Update  AspNetUserRoles
Set RoleId = 4
From AspNetUsers as b Inner Join AspNetUserRoles as a
    On a.UserId = b.Id Where b.Email = 'some@email.com'

Теперь, как редактировать этот запрос, вместо предоставления RoleId (в данном случае 4),получить конкретный идентификатор роли из таблицы, указав ее имя? AspNetRoles таблица имеет поле 'name', я попытался с другим внутренним соединением, но не смог.Спасибо за любую помощь, спасибо.

Ответы [ 4 ]

2 голосов
/ 08 апреля 2019

В вашем запросе UPDATE я удалил JOIN, потому что у вас есть эта информация в вашей почтовой таблице.

Итак, я добавил подзапрос для обновления вашего RoleId

Попробуйте это:

UPDATE AspNetUserRoles
SET RoleId = (SELECT c.id FROM AspNetRoles c WHERE c.name = 'MyRoleName')
FROM AspNetUsers as b 
WHERE b.Email = 'some@email.com'
AND AspNetUserRoles.UserId = b.Id
1 голос
/ 08 апреля 2019

Вы можете использовать JOIN следующим образом:

update  aur
    set RoleId = 4
from AspNetUsers au join
     AspNetUserRoles  ur
     on aur.UserId = au.Id join
     AspNetRoles r
     on ur.RoleId = r.roleId
where au.Email = 'some@email.com' and
      r.Name = ?;

Это кажется странным.ApsNetUserRoles звучит как распределительная таблица.Я ожидаю, что вы добавите роль, вставив роль в эту таблицу.

1 голос
/ 08 апреля 2019

Вы можете написать запрос для получения идентификатора роли в зависимости от имени

SELECT r.id
FROM AspNetRoles r
WHERE r.name = 'YourRoleName'
LIMIT 1

И используйте этот запрос в качестве подзапроса в вашей основной:

Update  AspNetUserRoles
Set RoleId = 
(
    SELECT r.id
    FROM AspNetRoles r
    WHERE r.name = 'YourRoleName'
    LIMIT 1
)
From AspNetUsers as b Inner Join AspNetUserRoles as a
    On a.UserId = b.Id Where b.Email = 'some@email.com'
0 голосов
/ 08 апреля 2019

Попробуйте это:

  Update AspNetUserRoles
    Set AspNetUserRoles.RoleId = a.RoleId
    From AspNetUsers as b 
    Inner Join AspNetUserRoles as a
        On a.UserId = b.Id 
    Where b.Email = 'some@email.com'
      and  a.name = 'name'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...