Создать таблицу, используя 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...)
Другие вопросы по тегам