2016-08-03 1 views
2

Я строю миграцию в Postgres, где мне нужно добавить одного нового пользователя для каждой организации.Как построить отношения, используя данные из двух таблиц?

Если предположить, что у меня есть дерево таблицы:

  • пользователя
  • орг
  • user_org

и список организаций, уже существующих в БД.

Теперь я создаю новые пользователь на основе других пользователей и измененные данных, например так:

insert into users 
select 
    ... 
from users where ... 
returning id 

Что мне теперь нужно связать каждый пользователь к одной организации (при условии, что количество созданных пользователей и числа Оргов соответствия).

cross join не будет работать, так как он свяжет всех пользователей со всеми организациями.

Список пользователей, которых я копирую из уже связанных с orgs, есть простой способ построить мой запрос на основе этого, учитывая, что у вновь созданных пользователей есть разные ключи?

+0

Не уверен, что я полностью понять ваш вопрос. Предполагая, что у вас 10 организаций, вы хотите вставить 10 пользователей, 1 на каждую организацию? Возможно, полезны примеры данных и ожидаемые результаты. – sgeddes

+0

@sgeddes Правильно –

+0

. Версия Postgres и определения таблиц будут раздутыми. –

ответ

2

Если я понять правильно, вот один вариант с использованием inner join, а затем создание row_number за стол, чтобы join на:

insert into user_org 
select u.id, o.id 
from (select id, row_number() over (order by id) rn 
     from usr) u join 
    (select id, row_number() over (order by id) rn 
     from org) o on u.rn = o.rn 
+0

Я попробую, что –

+0

Похоже, он делает то, что мне нужно, я сделаю еще несколько тестов и отправлю обратно. Благодаря! –

+0

'order by id 'в обоих подзапросах потребует синхронизации * значений * usr.id' и' org.id' - это очень маловероятное предположение. Конечно, не на основе информации в вопросе. Как правило, этот запрос не работает. –

0

Перечень пользователи, которых я копирую из уже связанных с организациями, есть простой способ построить мой запрос на основе этого, учитывая, что только что созданные пользователи разные ключи?

Если для идентификации уникального пользователя без ПК существует какое-либо подмножество столбцов, существует защищенное решение с модифицирующими данные CTE. Можно даже вставить несколько пользовательских ксерокопии сразу:

В маловероятном случае, что вы не должны иметь надежный набор столбцов, чтобы присоединиться к пользователям шаблона: добавить номер строки, как @sgeddes already suggested, но в запрос, который на самом деле работает:

WITH template_usr AS (
    SELECT u.*, uo.org_id -- include the connected org_id 
      row_number() OVER() AS rn -- arbitrary number 
    FROM usr  u 
    JOIN usr_org uo ON uo.usr_id = u.id -- guessing column names 
    WHERE ... -- make sure exactly *one* desired org is joined 
    ) 
, ins_usr AS (
    INSERT INTO usr u (...) -- add target columns 
    SELECT ... 
    FROM template_usr 
    ORDER BY rn    -- insert in same order! 
    RETURNING id 
    ) 
INSERT INTO usr_org (usr_id, org_id) 
SELECT iu.id, tu.org_id 
FROM (
    SELECT id, row_number() OVER (ORDER BY id) AS rn 
    FROM ins_usr 
    ) iu 
JOIN template_usr tu USING (rn) 
RETURNING *; -- optional 

Похожие:

 Смежные вопросы

  • Нет связанных вопросов^_^