Обновить несколько строк с помощью подзапроса - PullRequest
1 голос
/ 13 мая 2011

У меня есть две таблицы: UserStatus и User.

UserStatus имеет два поля: Имя пользователя, состояние

У пользователя есть два поля Имя пользователя, удалено

Это запрос, который я использую

Update users
   set deleted = '1'
where username = (select username
                    from tempDUDPIVOT 
                   where status = 'inactive')

но получите ошибку:

Подзапрос вернул более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Я пробовал несколько вариантов, но не могу найти решение ... У меня ощущение, что оно очень очевидно.

Ваша помощь приветствуется.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 13 мая 2011
Update users set deleted = '1'
where username IN (select username from tempDUDPIVOT where status = 'inactive')

IN принимает 0..inf значения, которые будут возвращены, а = принимает 1 и только одно (не 0 или 42).

2 голосов
/ 13 мая 2011

Синтаксис UPDATE требует скалярного подзапроса. Использование EXISTS (subquery) сближает параметры предиката (т.е. облегчает чтение и обслуживание запроса, IMO), например

UPDATE users 
   SET deleted = '1' 
 WHERE EXISTS (
               SELECT *
                 FROM tempDUDPIVOT AS T1
                WHERE T1.status = 'inactive'
                      AND T1.username = users.username
              );

Вы также можете использовать Стандартный SQL MERGE, если ваш продукт SQL поддерживает его (хотя обратите внимание на параметры предиката здесь далее):

MERGE INTO users 
   USING (
          SELECT username
            FROM tempDUDPIVOT
           WHERE status = 'inactive'
         ) AS T1 (username)
      ON T1.username = users.username
WHEN MATCHED THEN 
   UPDATE
      SET users.deleted = '1';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...