Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / WITH AS, UPSERT, RETURNING / 4 сообщений из 4, страница 1 из 1
17.07.2015, 10:18
    #39009543
samoxod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WITH AS, UPSERT, RETURNING
Добрый день.
Помогите разобраться: с закоменчеными строками работает, а если раскомментить строки, то получаю синтаксическую ошибку
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
DO $$
BEGIN
	 CREATE TEMP TABLE TSrc    ( f1 int, f2 int );
	 CREATE TEMP TABLE TTarget ( f1 int, f2 int );
	 CREATE TEMP TABLE TLog    ( f1 int, f2 int, act int );

	INSERT INTO TSrc VALUES(1,1), (1,3), (1,5), (2,1), (2,5), (2,10);
	INSERT INTO TTarget VALUES(1,3), (1,4), (2,5), (2,6);

	WITH Src AS
	(
		SELECT f1, f2 FROM TSrc				
	),
	Upd AS
	(
		UPDATE TTarget t  SET f2 = s.f2
		FROM	Src s
		WHERE	t.f1 = s.f1 and t.f2 = s.f2
		RETURNING  t.f1, t.f2		
	)
	, INS AS
 	(
		INSERT INTO TTarget (f1, f2)
		SELECT s.f1, s.f2
		FROM  Src s	
		LEFT JOIN Upd u on u.f1 = s.f1 and u.f2 = s.f2
		WHERE u.f1 IS NULL	
--		RETURNING  s.f1, s.f2		-- not the underlying table that the statement modifies
	)

	INSERT INTO TLog
	Select f1, f2, 2 as act from Upd
-- 	UNION
-- 	Select f1, f2, 1 as act from Ins 
	;
END
$$;
Select * from TTarget;
Select * from TLog;



авторОШИБКА: таблица "s" отсутствует в предложении FROM
LINE 19: RETURNING s.f1, s.f2 -- not the underlying table that th...
...
Рейтинг: 0 / 0
17.07.2015, 10:57
    #39009600
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WITH AS, UPSERT, RETURNING
автор-- not the underlying table that the statement modifiesчем отличаются значения, получившиеся в underlying table, от значений источника?
...
Рейтинг: 0 / 0
17.07.2015, 11:30
    #39009653
ursido
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WITH AS, UPSERT, RETURNING
samoxod,

В документации написано:
авторThe optional RETURNING clause causes INSERT to compute and return value(s) based on each row actually inserted . This is primarily useful for obtaining values that were supplied by defaults, such as a serial sequence number. However, any expression using the table's columns is allowed. The syntax of the RETURNING list is identical to that of the output list of SELECT.

В скрипте идет попытка выдать другие поля, то есть не те что указаны в определении таблицы. О чем и сообщено в ошибке.
...
Рейтинг: 0 / 0
17.07.2015, 11:49
    #39009692
samoxod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WITH AS, UPSERT, RETURNING
ursido,

Спасибо, я то читал в другом месте :
авторWhen writing a data-modifying statement (INSERT, UPDATE or DELETE) in WITH, it is usual to include a RETURNING clause. It is the output of RETURNING, not the underlying table that the statement modifies, that forms the temporary table that is read by the primary query. и видимо неправильно понял про базовую таблицу
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / WITH AS, UPSERT, RETURNING / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]