powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите найти ошибку в запросе update
3 сообщений из 3, страница 1 из 1
Помогите найти ошибку в запросе update
    #39818041
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я не понимаю, что не нравится PostreSQL. Гугл тоже ничего полезного не говорит.
Версия: PostgreSQL 9.6.13

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TEMP TABLE IF NOT EXISTS temp_folder_tag AS 
	SELECT	
		CAST(0 AS BIGINT) AS folder_tag_id,
		t.ft_type,
		t.ft_content,
		t.folder_tag_value
	FROM json_to_recordset(p_tags)
		as t(ft_type folder_tag_type, ft_content smallint, folder_tag_value varchar(100));
			
	INSERT INTO spr_folder_tags(folder_tag_value)
	SELECT		
		t.folder_tag_value
	FROM temp_folder_tag t
		LEFT JOIN spr_folder_tags f ON f.folder_tag_value = t.folder_tag_value
	WHERE f.folder_tag_value IS NULL;
	
	UPDATE temp_folder_tag as t SET
		t.folder_tag_id = f.folder_tag_id
	FROM spr_folder_tags as f
	WHERE t.folder_tag_value = f.folder_tag_value;


2 первых подзапроса в функции отрабатывают нормально. На последнем ругается:
"ERROR: column "t" of relation "temp_folder_tag" does not exist
LINE 2: t.folder_tag_id = f.folder_tag_id
^
QUERY: UPDATE temp_folder_tag as t SET
t.folder_tag_id = f.folder_tag_id
FROM spr_folder_tags as f
WHERE t.folder_tag_value = f.folder_tag_value".

Не понимаю, почему алиас "t" считается колонкой? Пробовал другой алиас, та же фигня.
---
Проходя мимо разложенных граблей, ты теряешь драгоценный опыт. (с)
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе update
    #39818050
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Megabyte,

потому что таков синтаксис update. Алиасу там не место.
set column_name - строго имя колонки обновляемой таблицы. Здесь нет и не может быть неоднозначности, update в postgresql обновляет строки только одной таблицы.

Синтаксис set column_name.attribute = - это про композитные типы данные. При этом перед точкой стоит именно имя поля таблицы, в котором сохранены данные композитного типа. Поэтому вы и получаете ошибку о том, что поля такого не существует в этой таблице.

https://www.postgresql.org/docs/current/sql-update.html
Do not include the table's name in the specification of a target column — for example, UPDATE table_name SET table_name.col = 1 is invalid.
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе update
    #39818059
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijMegabyte,

потому что таков синтаксис update. Алиасу там не место.
set column_name - строго имя колонки обновляемой таблицы. Здесь нет и не может быть неоднозначности, update в postgresql обновляет строки только одной таблицы.

Синтаксис set column_name.attribute = - это про композитные типы данные. При этом перед точкой стоит именно имя поля таблицы, в котором сохранены данные композитного типа. Поэтому вы и получаете ошибку о том, что поля такого не существует в этой таблице.

https://www.postgresql.org/docs/current/sql-update.html
Do not include the table's name in the specification of a target column — for example, UPDATE table_name SET table_name.col = 1 is invalid.
Спасибо за пояснение. Разобрался.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите найти ошибку в запросе update
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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