Много запросов в одном и ответ в виде множества записей

vilak
Дата: 02.02.2015 09:42:10
Добрый день,

Понравилась конструкция вида :
WITH 
u AS ( 
SELECT id,param1 FROM product WHERE param1 = 35 
)
, i AS (     
INSERT INTO product (param1, last_update)     
SELECT 35, NULL     
WHERE NOT EXISTS (SELECT 1 FROM u)     
RETURNING id,param1
) 
SELECT id , param1 FROM i 
UNION ALL 
SELECT id , param1 FROM u; 

Она возвращает id,param1 - 1,35.

А можно сделать так, чтобы в одном запросе было много таких запросов и возвращался результат как набор записей :
1,35
2,37
3,40
...

?

Пробовал вставлять между конструкциями UNION ALL , но выпадает ошибка синтаксиса. Что-то делаю не так.
Alexius
Дата: 02.02.2015 13:02:38
vilak,

можно: сначала идут with блоки, потом запрос с union all'ами.

но правильнее делать как-то так:

with t1 as (
select id from (values (35),(37),(42)) t(id)
),
t2 as (
insert into product(param1, last_update) select id, null from t1 where not exists (select 1 from product p where p.id = t1.id) returning id
)

select * from product p where p.id in (select id from t1)


думаю, идея понятна.
Дата: 02.02.2015 13:11:07
vilak
Добрый день,

Понравилась конструкция вида :
WITH 
u AS ( 
SELECT id,param1 FROM product WHERE param1 IN( 35 ,37,40)
)
, i AS (     
INSERT INTO product (param1, last_update)     
SELECT 35, NULL     
WHERE NOT EXISTS (SELECT 1 FROM u)     
RETURNING id,param1
) 
SELECT id , param1 FROM i 
UNION ALL 
SELECT id , param1 FROM u; 

Она возвращает id,param1 - 1,35.

А можно сделать так, чтобы в одном запросе было много таких запросов и возвращался результат как набор записей :
1,35
2,37
3,40
...

?

Пробовал вставлять между конструкциями UNION ALL , но выпадает ошибка синтаксиса. Что-то делаю не так.
Alexius
Дата: 02.02.2015 13:20:18
Alexius,

точнее как-то так:
with t1 as (
select param1 from (values (35),(37),(42)) t(param1)
),
t2 as (
insert into product(param1, last_update) select param1, null from t1 where not exists (select 1 from product p where p.param1 = t1.param1) returning *
)

select id, param1 from product p where p.param1 in (select param1 from t1)
union all
select id, param1 from t2;
vilak
Дата: 02.02.2015 14:15:51
Alexius,

да, так работает, благодарю.