У меня есть три таблицы:
group:
id - primary key
name - varchar
profile:
id - primary key
name - varchar
surname - varchar
[...etc...]
profile_group:
profile_id - integer, foreign key to table profile
group_id - integer, foreign key to table group
Профили могут быть во многих группах. У меня есть группа «Пользователи» с id = 1, и я хочу назначить всех пользователей в эту группу, но только если такой записи для профилей таблиц не было.
Как это сделать?
2 ответа
Если я вас правильно понял, вы хотите добавить записи типа ( profile_id , 1) в таблицу profile_group
для всех профилей, которых раньше не было в этой таблице. Если да, попробуйте следующее:
INSERT INTO profile_group(profile_id, group_id)
SELECT id, 1 FROM profile p
LEFT JOIN profile_group pg on (p.id=pg.profile_id)
WHERE pg.group_id IS NULL;
Что вы хотите сделать, так это использовать левое соединение с таблицей группы профилей, а затем исключить любые совпадающие записи (это делается в предложении where приведенного ниже оператора SQL).
Это быстрее, чем использование not in (select xxx)
, поскольку профилировщик запросов, кажется, справляется с этим лучше (по моему опыту)
insert into profile_group (profile_id, group_id)
select p.id, 1
from profiles p
left join profile_group pg on p.id = pg.profile_id
and pg.group_id = 1
where pg.profile_id is null
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.