Создать таблицу, используя SQL, комбинируя данные столбца из двух или более других таблиц
Я пытался выяснить, как вставить данные в новую таблицу соединений, используя данные столбца из двух других таблиц. Сначала это казалось простым, но не сразу стало очевидным, теперь я могу найти решение где угодно.
Пример: у меня есть таблица tProfiles:
выберите prof_id из tProfiles
prof_id
1
2
3
4
5
...
и таблица с ролями tRole
выберите роль в tRole
roleid
1
2
3
4
5
6
7
...
а новому tRoleByProfile нужны все роли из tRole и все prof_id из tProfiles с использованием такой вставки: вставка в tRoleByProfile(RoleId, ProfileId)
2 ответа
Сейчас я делаю несколько соединений здесь, чтобы получить только профили с активными пользователями в них, как это.
insert into tRoleByProfile(RoleId, ProfileId)
select distinct r.RoleId, p.prof_id from tRole r, tProfiles p
inner join tUserRoles ur on p.PROF_ID = ur.prof_id
inner join tUsers u on u.user_id = ur.user_id
inner join tUserLogins ul on ul.user_id = u.user_id
where u.user_inactive_flg = 'N'
обратите внимание на выбор, который я должен использовать отдельно при полном присоединении. Без использования Distinct создаст много дубликатов данных. См. http://www.informit.com/articles/article.aspx?p=30875&seqNum=5 для получения дополнительной информации о полном присоединении.
Теперь моя новая таблица соединений содержит точные данные, необходимые из объединенных двух таблиц.
Возможно, вы могли бы сделать...
INSERT INTO tRoleByProfile
SELECT r.RoleId, p.prof_id
FROM tRole r
JOIN tProfiles p;
Соединение двух таблиц без каких-либо условий приведет к результирующему набору, который включает каждую комбинацию записей из обеих таблиц. Другими словами, каждый профиль получит каждую роль.
Чтобы отфильтровать, какие строки включены в декартово объединение (то есть объединение без отношения), отфильтруйте обе стороны вышеупомянутого СОЕДИНЕНИЯ, сделав их отдельным выделением, как в...
INSERT INTO tRoleByProfile
SELECT r.RoleId, p.prof_id
FROM tRole r
JOIN (SELECT prof_id
FROM tProfiles
WHERE blah...)