2014-11-27 1 views
0

Привет, У меня есть этот запрос, который возвращает список клиентов, которые существуют в одной таблице, но не в другом. Для каждого возвращаемого customer_id мне нужно добавить 2 строки в таблицу профилей.Вставка 2 разных строк из списка

Как бы написать в sql вставку для двух строк?

select * FROM 
(select * 
from customer c 
left outer join profile cp 
on cp.customer_id=c.global_id 
order by c.global_id) as A 
where id is NULL; 

Спасибо!

ответ

3

Одним из вариантов было бы создать cartesian product с помощью cross join:

insert into profile (customerid ...) 
select customerid ... 
FROM 
    (select * 
    from customer c 
     left outer join profile cp 
      on cp.customer_id=c.global_id 
    ) as A cross join (SELECT 1 col UNION SELECT 2) as B 
where id is NULL; 
3

CROSS JOIN (такой же, как , в FROM списке) для выражения в VALUES является самым коротким и простым способом для небольшого числа строк:

INSERT INTO profile (<list of columns>) 
SELECT <list of columns> 
FROM (
    SELECT <list of columns> 
    FROM customer c 
    LEFT JOIN profile p ON p.customer_id = c.global_id 
    WHERE p.customer_id IS NULL 
    ) A 
, (VALUES (1), (2)) dummy(col_name) 
ORDER BY global_id; 

Используйте явный список столбцов в SELECT и INSERT, чтобы избежать неожиданных результатов при изменении чего-либо позже.

Вы, вероятно, не собираетесь INSERT два идентичны строк. Вы можете сразу предоставить полезные значения в подзапросе dummy. Возможно с явным типом. Нравится:

(VALUES ('foo'::text), ('bar')) dummy(col_name) 
Смежные вопросы