2016-11-28 3 views
0

У меня есть три таблицы с двумя столбцами для каждой таблицы.PostgreSQL 9.5: При обновлении конфликта с CTE

Таблица: СТ1

create table ct1 
(
id int primary key, 
name varchar(10) 
); 

Таблица: СТ2

create table ct2 
(
id int primary key, 
name varchar(10) 
); 

Таблица: ct3

create table ct3 
(
id int primary key, 
name varchar(10) 
); 

Вставка:

insert into ct1 values(1,'A'); 
insert into ct1 values(2,'B'); 

insert into ct1 values(11,'C'); 
insert into ct1 values(12,'D'); 

Примечание: Я хочу, чтобы вставить запись в закладке таблицы ct3 путем выбора данных из двух других с использованием CTE таблицы (обязательное).

Моя попытка:

Запрос:

INSERT INTO ct3(id,name) 
WITH CTE 
AS 
(
    SELECT id,name from ct1 
    WHERE id is not null 
), 
cte2 
as 
(
    SELECT id,name from ct2 
    WHERE name is not null 
) 
select c1.id as id1,c2.name as name1 from cte as c1,cte2 as c2 
on conflict (id) do update 
set 
id = id1, 
name = name1; 

Ошибка:

ERROR: column "id1" does not exist 
LINE 17: id = id1, 
+0

'from cte as c1, cte2 as c2' выглядит неправильно. Вы ** действительно ** хотите ** крест ** присоединиться (декартовой продукт) между двумя таблицами? –

ответ

0

Вкладыш должен быть окончательный запрос после в КТР

WITH CTE 
AS 
(
    SELECT id,name from ct1 
    WHERE id is not null 
), 
cte2 
as 
(
    SELECT id,name from ct2 
    WHERE name is not null 
) 
INSERT INTO ct3(id,name) --<< INSERT needs to go here 
select c1.id as id1,c2.name as name1 
from cte as c1, 
    cte2 as c2 --<< are you SURE you want a cross join here? 
on conflict (id) do update 
-- no need to update the ID column here as that is the one used for conflict detection 
set name = name1; 
+1

В чем смысл обновления конфликта с использованием тех же значений, которые были бы вставлены (я не ставил под сомнение ваш синтаксис)? –

+0

@TimBiegeleisen: хороший пункт. Я только что сделал копию и вставку этой части. –

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