SQL обновление с использованием подзапросов H2 - PullRequest
1 голос
/ 16 марта 2020

У меня есть простая структура таблицы, подобная этой:

USER_ROLE +------------+----------------------+ | USER_ID | USER_ROLE | +------------+----------------------+ | U007 | A | | U007 | B | | U007 | C | | U008 | A | | U009 | A | | U009 | B | +------------+----------------------+

Я хотел бы изменить USER_ROLE на «Z» вместо «A» и «B», однако ключ составленный (USER_ID и USER_ROLE).

1) Первый запрос имеет значение USER_ROLE, равное 'Z', где у пользователя есть только одна роль из коллекции ('A', 'B').

UPDATE ( SELECT USER_ID FROM USER_ROLE WHERE USER_ROLE IN ('A', 'B') GROUP BY USER_ID HAVING COUNT(*) = 1 ) SET USER_ROLE = 'Z';

но это не работает. Как это должно выглядеть?

1 Ответ

1 голос
/ 17 марта 2020

Вот вам go:

update user_role set user_role = 'Z'
where user_id in (
        select user_id
        from user_role
        where user_role in ('A', 'B')
        group by user_id
        having count(*) = 1)
  and user_role in ('A', 'B');

Результат:

select * from user_role;

USER_ID  USER_ROLE  CREATED   
-------  ---------  ----------
U007     A          2020-01-01
U007     B          2020-01-02
U007     C          2020-01-03
U009     A          2020-01-05
U009     B          2020-01-06
U008     Z          2020-01-04

Вот сценарий данных, который я использовал в H2 1.4.197:

create table user_role (
  user_id varchar(10),
  user_role varchar(10),
  created date,
  primary key (user_id, user_role)
);

insert into user_role (user_id, user_role, created) values 
  ('U007', 'A', '2020-01-01'), 
  ('U007', 'B', '2020-01-02'),
  ('U007', 'C', '2020-01-03'),
  ('U008', 'A', '2020-01-04'),
  ('U009', 'A', '2020-01-05'),
  ('U009', 'B', '2020-01-06');
...