Получить все идентификаторы из одной таблицы и вставить значения в другую таблицу на ее основе - PullRequest
0 голосов
/ 30 июня 2019

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

Таблица 1: Компании (id, name) Таблица 2: Праздники (id, companyId, name)

В настоящее время в таблице компаний есть данные, но праздничных дней нетт.Я хочу пройтись по всем компаниям, получить их идентификаторы и вставить две записи в праздничные дни для каждой компании.Так что это будет до и после:

До:

Companies
| id | name  |
|  0 | test1 |
|  1 | test2 |

Праздники: Empty table

После:

Companies
| id | name  |
|  0 | test1 |
|  1 | test2 |
Holidays:
| id | companyId | name     | 
|  0 |         0 | holiday1 |
|  1 |         0 | holiday2 |
|  2 |         1 | holiday1 |
|  3 |         1 | holiday2 |

Ответы [ 3 ]

1 голос
/ 30 июня 2019

Вам необходимо самообъединение для таблицы Companies и логика итерации для получения значений столбца id для Holidays. Поэтому рассмотрите возможность использования:

insert into Holidays(id,company_id,name)
select @rn := @rn + 1, c1.id, concat('Holiday',(c1.id+1))
  from Companies c1
  join Companies c2
  join (select @rn := -1) as q_iter;

Демо

1 голос
/ 30 июня 2019

Предполагается, что для Holidays.id задано автоматическое увеличение:

insert into Holidays (select id as companyId, 'holiday1' as name from Companies);
insert into Holidays (select id as companyId, 'holiday2' as name from Companies);
0 голосов
/ 30 июня 2019

Я думаю, что вы хотите:

insert into holidays (companyId, name)
    select c.companyId, h.name
    from companies c cross join
         (select 1 as ord, 'holiday1' as name union all
          select 2 as ord, 'holiday2'
         ) h
    order by c.companyId, h.ord;

Предполагается, что holidays.id - столбец с автоинкрементом. Если нет, вы должны сделать это один. Если нет, то вы можете использовать row_number():

insert into holidays (id, companyId, name)
    select row_number() over (order by c.companyId, h.ord),
           c.companyId, h.name
    from companies c cross join
         (select 1 as ord, 'holiday1' as name union all
          select 2 as ord, 'holiday2'
         ) h
    order by c.companyId, h.ord;

Или параметр:

insert into holidays (id, companyId, name)
    select (@rn := @rn + 1) as id,
           c.companyId, h.name
    from companies c cross join
         (select 1 as ord, 'holiday1' as name union all
          select 2 as ord, 'holiday2'
         ) h cross join
         (select @rn := 0) params
    order by c.companyId, h.ord;
...