powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / WITH AS, UPSERT, RETURNING
4 сообщений из 4, страница 1 из 1
WITH AS, UPSERT, RETURNING
    #39009543
samoxod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Помогите разобраться: с закоменчеными строками работает, а если раскомментить строки, то получаю синтаксическую ошибку
Код: 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
WITH AS, UPSERT, RETURNING
    #39009600
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор-- not the underlying table that the statement modifiesчем отличаются значения, получившиеся в underlying table, от значений источника?
...
Рейтинг: 0 / 0
WITH AS, UPSERT, RETURNING
    #39009653
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
WITH AS, UPSERT, RETURNING
    #39009692
samoxod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / WITH AS, UPSERT, RETURNING
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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