Меню

Ошибка синтаксиса примерное положение table

Syntax errors are quite common while coding.

But, things go for a toss when it results in website errors.

PostgreSQL error 42601 also occurs due to syntax errors in the database queries.

At Bobcares, we often get requests from PostgreSQL users to fix errors as part of our Server Management Services.

Today, let’s check PostgreSQL error in detail and see how our Support Engineers fix it for the customers.

What causes error 42601 in PostgreSQL?

PostgreSQL is an advanced database engine. It is popular for its extensive features and ability to handle complex database situations.

Applications like Instagram, Facebook, Apple, etc rely on the PostgreSQL database.

But what causes error 42601?

PostgreSQL error codes consist of five characters. The first two characters denote the class of errors. And the remaining three characters indicate a specific condition within that class.

Here, 42 in 42601 represent the class “Syntax Error or Access Rule Violation“.

In short, this error mainly occurs due to the syntax errors in the queries executed. A typical error shows up as:

Here, the syntax error has occurred in position 119 near the value “parents” in the query.

How we fix the error?

Now let’s see how our PostgreSQL engineers resolve this error efficiently.

Recently, one of our customers contacted us with this error. He tried to execute the following code,

CREATE OR REPLACE FUNCTION prc_tst_bulk(sql text)
RETURNS TABLE (name text, rowcount integer) AS
$$
BEGIN
WITH m_ty_person AS (return query execute sql)
select name, count(*) from m_ty_person where name like '%a%' group by name
union
select name, count(*) from m_ty_person where gender = 1 group by name;
END
$$ LANGUAGE plpgsql;

But, this ended up in PostgreSQL error 42601. And he got the following error message,

ERROR: syntax error at or near "return"
LINE 5: WITH m_ty_person AS (return query execute sql)

Our PostgreSQL Engineers checked the issue and found out the syntax error. The statement in Line 5 was a mix of plain and dynamic SQL. In general, the PostgreSQL query should be either fully dynamic or plain. Therefore, we changed the code as,

RETURN QUERY EXECUTE '
WITH m_ty_person AS (' || sql || $x$)
SELECT name, count(*)::int FROM m_ty_person WHERE name LIKE '%a%' GROUP BY name
UNION
SELECT name, count(*)::int FROM m_ty_person WHERE gender = 1 GROUP BY name$x$;

This resolved the error 42601, and the code worked fine.

[Need more assistance to solve PostgreSQL error 42601?- We’ll help you.]

Conclusion

In short, PostgreSQL error 42601 occurs due to the syntax errors in the code. Today, in this write-up, we have discussed how our Support Engineers fixed this error for our customers.

PREVENT YOUR SERVER FROM CRASHING!

Never again lose customers to poor server speed! Let us help you.

Our server experts will monitor & maintain your server 24/7 so that it remains lightning fast and secure.

GET STARTED

var google_conversion_label = «owonCMyG5nEQ0aD71QM»;

I’m trying to add a column named order to my table. I realize that order is a reserved word in SQL. So, how do I do it?
My command:

   alter table mytable add column order integer;

I’ve also tried:

   alter table mytable add column 'order' integer;

PostgreSQL 9.1.

a_horse_with_no_name's user avatar

asked Apr 15, 2014 at 19:08

ed_is_my_name's user avatar

3

Use this:

alter table mytable add column "order" integer;

But, you might want to consider using a non-reserved name instead, like sort_order or something similar that reflects what the column is used for (and isn’t a reserved word).

answered Apr 15, 2014 at 19:12

jpw's user avatar

jpwjpw

44k6 gold badges67 silver badges85 bronze badges

3

I think you don’t need «column». Plus «order» is a keyword in SQL, so you should use a different name for your column. Follow this syntax:

ALTER TABLE table_name ADD column_name datatype

Source: W3Schools

answered Apr 15, 2014 at 19:14

DerStrom8's user avatar

DerStrom8DerStrom8

1,3212 gold badges23 silver badges45 bronze badges

ALTER TABLE table_name
ADD COLUMN "order" integer

answered Apr 15, 2014 at 19:13

DidIReallyWriteThat's user avatar

0

You are using order which is a reserved keyword you should consider renaming that to something like orders. And the problem should go away.

answered Sep 10, 2021 at 7:06

David Innocent's user avatar

  • Печать

Страницы: [1]   Вниз

Тема: Postgres (db error)  (Прочитано 18485 раз)

0 Пользователей и 1 Гость просматривают эту тему.

ПРивет!
Решил вот попробовать вашу софтину! Но никак не получается ее завести
Установил POstgresql сервер и ОДБЦ драйвер!
Создал базу данных!
Настроил в подключении парамеры — нажал Тест! Получил Ответ ОК!
Далее залил в базу дамп
Пробую войти и получаю ошибку

BKO.NET 1.7.5.1
Версия базы данных не является эталонной
Вносим изменения в базу …
Жму ОК
Внесение изменений закончилось неудачей, воспользуйтесь конвертором или скриптами
ОК — и программазакрывается!
ЧТо делать ?
Спасибо


Записан


select access from configure
дальше будем смотреть…


Записан


«1.7.3.5»
Я пробовал поменять на 1.7.5.1 — но результат тот же

« Последнее редактирование: 28 Февраль 2014, 10:38:35 от Digitec »


Записан


ALTER TABLE Remont ADD COLUMN GARANT Date;
ALTER TABLE kompy ADD COLUMN MB_NAME varchar(255) Mb;
UPDATE TABLE kompy SET MB_NAME=Mb;
ALTER TABLE kompy DROP COLUMN Mb, nomerPC, TEXT_RED, EXCELL_RED, ACCESS_RED, VG, IG;
ALTER TABLE kompy ADD COLUMN data_sp Date,ADD COLUMN data_nb Date;
Update CONFIGURE SET access='1.7.3.9' WHERE access<>'1.7.3.9';


Записан


ОШИБКА:  ошибка синтаксиса (примерное положение: «Mb»)
LINE 2: ALTER TABLE kompy ADD COLUMN MB_NAME varchar(255) Mb;
                                                          ^
********** Ошибка **********

ОШИБКА: ошибка синтаксиса (примерное положение: «Mb»)
SQL-состояние: 42601
Символ: 94

И кстати при внесении дампа в постгрес имеем две ошибки
ОШИБКА:  ошибка синтаксиса (примерное положение: «EXTENSION»)
СТРОКА 1: CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalo…
                 ^
ОШИБКА:  ошибка синтаксиса (примерное положение: «EXTENSION»)
СТРОКА 1: COMMENT ON EXTENSION plpgsql IS ‘PL/pgSQL procedural languag…
                     ^

« Последнее редактирование: 28 Февраль 2014, 11:02:03 от Digitec »


Записан


ALTER TABLE kompy ADD COLUMN MB_NAME varchar(255);


Записан


пробуем так
ALTER TABLE Remont ADD COLUMN GARANT Date;
ALTER TABLE kompy ADD COLUMN MB_NAME varchar(255);
UPDATE  kompy SET MB_NAME=Mb;
ALTER TABLE kompy DROP COLUMN Mb, nomerPC, TEXT_RED, EXCELL_RED, ACCESS_RED, VG, IG;
ALTER TABLE kompy ADD COLUMN data_sp Date,ADD COLUMN data_nb Date;
Update CONFIGURE SET access=’1.7.3.9′ WHERE access<>’1.7.3.9′;

Получаем

ОШИБКА:  ошибка синтаксиса (примерное положение: «nomerPC»)
LINE 4: ALTER TABLE kompy DROP COLUMN Mb, nomerPC, TEXT_RED, EXCELL_…
                                          ^
********** Ошибка **********


Записан


Так
Немного поиграв в кашпировского
выполняем такой запрос

ALTER TABLE Remont ADD COLUMN GARANT Date;
ALTER TABLE kompy ADD COLUMN MB_NAME varchar(255);
UPDATE  kompy SET MB_NAME=Mb;
ALTER TABLE kompy DROP COLUMN Mb;
ALTER TABLE kompy DROP COLUMN nomerPC;
ALTER TABLE kompy DROP COLUMN TEXT_RED;
ALTER TABLE kompy DROP COLUMN EXCELL_RED;
ALTER TABLE kompy DROP COLUMN ACCESS_RED;
ALTER TABLE kompy DROP COLUMN VG;
ALTER TABLE kompy DROP COLUMN IG;
ALTER TABLE kompy ADD COLUMN data_sp Date,ADD COLUMN data_nb Date;
Update CONFIGURE SET access='1.7.3.9' WHERE access<>'1.7.3.9';

После чего пробуем войти и получаем уже совершенно другую ошибку (на дату ругается)
«Неверный синтаксис для типа date: «»09:33:10»


Записан


так получается что за место даты время…


Записан


Так как бы я это и сам вижу — вопрос в том — что и где поправить и почему оно так?
щас паралельно попробую базу под фрей развернуть


Записан


ну тут вопрос сложный, я дома пробовал все работало… сейчас проверить не могу…


Записан


ка кто можно определить какая это талица вбазе ругается? Я бы попробовал поиграть с параметрами?


Записан


думаю что это таблица kompy


Записан


Итак
есть успехи!
Взял версию 1.7.5.0
И наконецто запустиллось!
Но при входе уже пишет ошибку
колонка name_prog не существует
мои действия?


Записан


В итоге !
Скачал 1.7.3.3 — все завелось!
Мистика!
Вобщем приступаю к изучению — что правда мысль о возможно обновлении версии в будущем немного пугает


Записан


создать колонку name_prog в таблице configure


Записан


  • Печать

Страницы: [1]   Вверх

Пытаюсь создать табличку, вот такую

CREATE TABLE screens_items (
	screenitemid             bigint                                    NOT NULL,
	screenid                 bigint                                    NOT NULL,
	resourcetype             integer         DEFAULT '0'               NOT NULL,
	resourceid               bigint          DEFAULT '0'               NOT NULL,
	width                    integer         DEFAULT '320'             NOT NULL,
	height                   integer         DEFAULT '200'             NOT NULL,
	x                        integer         DEFAULT '0'               NOT NULL,
	y                        integer         DEFAULT '0'               NOT NULL,
	colspan                  integer         DEFAULT '0'               NOT NULL,
	rowspan                  integer         DEFAULT '0'               NOT NULL,
	elements                 integer         DEFAULT '25'              NOT NULL,
	valign                   integer         DEFAULT '0'               NOT NULL,
	halign                   integer         DEFAULT '0'               NOT NULL,
	style                    integer         DEFAULT '0'               NOT NULL,
	url                      varchar(255)    DEFAULT ''                NOT NULL,
	dynamic                  integer         DEFAULT '0'               NOT NULL,
	sort_triggers            integer         DEFAULT '0'               NOT NULL,
	application              varchar(255)    DEFAULT ''                NOT NULL,
	PRIMARY KEY (screenitemid)
);

Получаю
Error: ОШИБКА:  ошибка синтаксиса (примерное положение: "application")

psql --version
psql (PostgreSQL) 9.4.9 

Вроде слово «application» не зарезервировано?

Удаление колонок таблицы атрибутов для нескольких слоёв

HasT

Активный участник

Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Проекты: 1

Репутация: 55
Откуда: Харьков

Удаление колонок таблицы атрибутов для нескольких слоёв

Приветствую! Есть шейп-слой со следующей структурой таблицы атрибутов:

layer.jpg
layer.jpg (59.68 КБ) 12457 просмотров

— название объекта, уникальный номер для каждого объекта слоя
Необходимо разбить шейп-слой по «названию объекта», но в результирующих слоях в таблице атрибутов должна остаться только колонка с «порядковым номером»:

result.jpg
result.jpg (50.97 КБ) 12457 просмотров

Разбитие слоя по «названию объекта» сделал в QGIS (Вектор — Управление данными — Разбить векторный слой), удаление «лишнего текста» в названии файлов удалил через коммандер. Как удалить в наборе шейп-слоев из таблицы атрибутов определённую колонку (перебор каждого слоя не предлагать, очень много их…)? Софт: ArcGIS, QGIS, PostGIS, OGR… Спасибо!


Petruxin

Гуру

Сообщения: 1695
Зарегистрирован: 14 июн 2011, 16:47
Статьи: 2
Проекты: 2

Репутация: 132
Ваше звание: Завсегдатай
Откуда: Череповец

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

Petruxin » 14 дек 2012, 05:51

Доп модуль Table Manager пробовали?


Аватара пользователя

rhot

Гуру

Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Статьи: 1

Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

rhot » 14 дек 2012, 07:28

В PostGIS:

Код: Выделить всё

CREATE TABLE new AS
	SELECT number, ST_Multi(ST_Collect(the_geom))
		FROM 
			(SELECT name, number, (ST_Dump(geom)).geom AS the_geom
				FROM region) AS r
		GROUP BY name;
SELECT Populate_Geometry_Columns('new'::regclass);

Вместо ST_Collect можно использовать ST_Union, если хотите, чтобы удалились общие границы между полигонами с одинаковым полем NAME.

___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} _ Знание сила ¸.·´¯)¸.·´¯)___________


HasT

Активный участник

Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Проекты: 1

Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

HasT » 14 дек 2012, 10:56

Petruxin писал(а):Доп модуль Table Manager пробовали?

Table Manager не подходит. С ним нужно каждый слой (слоёв будет не менее 700) просматривать и удалять ненужное поле.


HasT

Активный участник

Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Проекты: 1

Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

HasT » 14 дек 2012, 11:05

rhot писал(а):В PostGIS:

Код: Выделить всё

CREATE TABLE new AS
	SELECT number, ST_Multi(ST_Collect(the_geom))
		FROM 
			(SELECT name, number, (ST_Dump(geom)).geom AS the_geom
				FROM region) AS r
		GROUP BY name;
SELECT Populate_Geometry_Columns('new'::regclass);

Вместо ST_Collect можно использовать ST_Union, если хотите, чтобы удалились общие границы между полигонами с одинаковым полем NAME.

Запустил данный запрос в pgAdmin, но в строке

получил ошибку «колонка «geom» не существует», — заменил «geom» на «the_geom». Далее в строке

получаю ошибку «колонка «r.number» должна фигурировать в предложении GROUP BY или использоваться в агрегатной функции». Как быть дальше?


Аватара пользователя

rhot

Гуру

Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Статьи: 1

Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

rhot » 14 дек 2012, 11:15

HasT писал(а):Как быть дальше?

Я вас, наверное, не правильно понял. Вы хотите из одного слоя получить несколько, разбитых по полю NAME?

___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} _ Знание сила ¸.·´¯)¸.·´¯)___________


HasT

Активный участник

Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Проекты: 1

Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

HasT » 14 дек 2012, 11:18

rhot писал(а):

HasT писал(а):Как быть дальше?

Я вас, наверное, не правильно понял. Вы хотите из одного слоя получить несколько, разбитых по полю NAME?

Да. Нужно из одного слоя сделать несколько, разбитых по полю Name, при этом в новых слоях не должно остаться поля Name.


HasT

Активный участник

Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Проекты: 1

Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

HasT » 14 дек 2012, 11:33

В базу данных PostGIS залил все разбитые слои по полю Name. Может как-то используя запрос

Код: Выделить всё

ALTER TABLE [u]"все таблицы"[/u] DROP COLUMN "NAME";

можно удалить ненужное поле? только как задать все таблицы в базе для этого запроса?…


Аватара пользователя

rhot

Гуру

Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Статьи: 1

Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

rhot » 14 дек 2012, 11:35

Тогда у меня ещё вопрос: а зачем это надо? Ведь можно при добавлении слоя сделать выборку по атрибутам, а само поле name скрыть через меню «свойства слоя».

___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} _ Знание сила ¸.·´¯)¸.·´¯)___________


Аватара пользователя

rhot

Гуру

Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Статьи: 1

Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

rhot » 14 дек 2012, 11:43

HasT писал(а):В базу данных PostGIS залил все разбитые слои по полю Name. Может как-то используя запрос

Код: Выделить всё

ALTER TABLE [u]"все таблицы"[/u] DROP COLUMN "NAME";

можно удалить ненужное поле? только как задать все таблицы в базе для этого запроса?…

Вам следует создать функцию, а потом вызвать её.

Код: Выделить всё

CREATE OR REPLACE FUNCTION test()
RETURNS VOID
AS $$
DECLARE
    my_row    RECORD;
BEGIN       
    FOR my_row IN 
        SELECT table_name
        FROM   information_schema.tables
        WHERE  table_schema = 'information_schema'
    LOOP
        ALTER TABLE my_row.table_name DROP COLUMN "NAME";
    END LOOP;
END;
$$ LANGUAGE plpgsql;

SELECT test();

___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} _ Знание сила ¸.·´¯)¸.·´¯)___________


HasT

Активный участник

Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Проекты: 1

Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

HasT » 14 дек 2012, 11:52

rhot писал(а):Тогда у меня ещё вопрос: а зачем это надо? Ведь можно при добавлении слоя сделать выборку по атрибутам, а само поле name скрыть через меню «свойства слоя».

слой создается в БД несколькими пользователями, затем будет производится дальнейшая его «обработка» несколькими операторами в проприетарном ПО, которое загружает слои только с определенной таблицей атрибутов


HasT

Активный участник

Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Проекты: 1

Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

HasT » 14 дек 2012, 12:40

rhot писал(а):Вам следует создать функцию, а потом вызвать её.

Код: Выделить всё

CREATE OR REPLACE FUNCTION test()
RETURNS VOID
AS $$
DECLARE
    my_row    RECORD;
BEGIN       
    FOR my_row IN 
        SELECT table_name
        FROM   information_schema.tables
        WHERE  table_schema = 'information_schema'
    LOOP
        ALTER TABLE my_row.table_name DROP COLUMN "NAME";
    END LOOP;
END;
$$ LANGUAGE plpgsql;

SELECT test();

Сделал функцию test(), только из-за ошибки «схема «my_row» не существует» поменял «my_row» на «public». При запуске запроса

получаю ошибку «отношение «public.table_name» не существует». Что я делаю неправильно?


Аватара пользователя

rhot

Гуру

Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Статьи: 1

Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

rhot » 14 дек 2012, 13:04

Код: Выделить всё

CREATE OR REPLACE FUNCTION test()
RETURNS VOID
AS $$
DECLARE
    my_row    RECORD;
BEGIN       
    FOR my_row IN
        SELECT table_name
        FROM   information_schema.tables
        WHERE  table_schema = 'information_schema'
    LOOP
        EXECUTE 'ALTER TABLE' || my_row.table_name || 'DROP COLUMN "NAME"';
    END LOOP;
END;
$$ LANGUAGE plpgsql;

___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} _ Знание сила ¸.·´¯)¸.·´¯)___________


HasT

Активный участник

Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Проекты: 1

Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

HasT » 14 дек 2012, 13:20

rhot писал(а):

Код: Выделить всё

CREATE OR REPLACE FUNCTION test()
RETURNS VOID
AS $$
DECLARE
    my_row    RECORD;
BEGIN       
    FOR my_row IN
        SELECT table_name
        FROM   information_schema.tables
        WHERE  table_schema = 'information_schema'
    LOOP
        EXECUTE 'ALTER TABLE' || my_row.table_name || 'DROP COLUMN "NAME"';
    END LOOP;
END;
$$ LANGUAGE plpgsql;

Пробую этот запрос… my_row — это же название схемы (у меня схема public)?
Для запроса получаю ошибку

Код: Выделить всё

ОШИБКА:  ошибка синтаксиса (примерное положение: "TABLEinformation_schema_catalog_nameDROP")
LINE 1: ALTER TABLEinformation_schema_catalog_nameDROP COLUMN "Polyg...
              ^
QUERY:  ALTER TABLEinformation_schema_catalog_nameDROP COLUMN "PolygonID"
CONTEXT:  PL/pgSQL function test() line 10 at оператор EXECUTE

И в базе сейчас загружены слои разбитые по полю Name, правильно?


Аватара пользователя

rhot

Гуру

Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Статьи: 1

Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение

rhot » 14 дек 2012, 13:35

my_row здесь — это любая запись из списка ваших таблиц.

А вообще, почитайте это.

___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} _ Знание сила ¸.·´¯)¸.·´¯)___________


    msm.ru

    Нравится ресурс?

    Помоги проекту!

    !
    информация о разделе

    user posted image Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных — обсуждаем в разделе «Базы данных: общие вопросы». Убедительная просьба — соблюдать «Правила форума» и не пренебрегать «Правильным оформлением своих тем». Прежде, чем создавать тему, имеет смысл заглянуть в раздел «Базы данных: FAQ», возможно там уже есть ответ.

    >
    UPDATE SELECT
    , PostgreSQL 9.4

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему

      


    Сообщ.
    #1

    ,
    22.03.16, 12:19

      Senior Member

      ****

      Рейтинг (т): 13

      ExpandedWrap disabled

        create table t1 (id integer, f1 integer, f2 integer);

        create table t2 (f1 integer, f2 integer);

        update t1 set (f1, f2) =

        (select t2.f1, t2.f2 from t1 right join t2 on t1.id = t2.f1);

      [Err] ОШИБКА: ошибка синтаксиса (примерное положение: «SELECT»)
      LINE 2: (SELECT
      ^
      Я никак не могу сообразить, как правильно обновлять значения в таблице на основании результатов SELECT .. FROM .. JOIN.
      Подскажите пожалуйста! :wall:


      grgdvo



      Сообщ.
      #2

      ,
      22.03.16, 20:20

        Member

        **

        Рейтинг (т): 21

        какая версия PG у вас?? Такой синтаксис только начиная с 9.5


        HighMan



        Сообщ.
        #3

        ,
        23.03.16, 07:09

          Senior Member

          ****

          Рейтинг (т): 13

          Цитата grgdvo @ 22.03.16, 20:20

          Я в топе указал, что PostgreSQL 9.4.
          Печально, что вышеприведенная конструкция работает лишь с 9.5.
          Но должна же быть схожая конструкция для младших версий.
          Вариант с where = (SELECT …) не интересен.
          Нужно обновление таблицы данными и по условию выборки из других таблиц.

          Master

          MIF



          Сообщ.
          #4

          ,
          23.03.16, 08:31

            Попробуй такой запрос:

            ExpandedWrap disabled

              update t1

              set t1.f1= t2.f1,

              t1.f2 =  t2.f2

              from t1

              right join t2 on t1.id = t2.f1


            grgdvo



            Сообщ.
            #5

            ,
            23.03.16, 12:10

              Member

              **

              Рейтинг (т): 21

              MIF, t1 нельзя указывать и под UPDATE и под FROM.

              HighMan, попробуйте вот так, вроде эквивалентно

              ExpandedWrap disabled

                update t1 set (f1, f2) = (t2.f1, t2.f2)

                from t2 where t1.id = t2.f1;


              HighMan



              Сообщ.
              #6

              ,
              23.03.16, 18:21

                Senior Member

                ****

                Рейтинг (т): 13

                ExpandedWrap disabled

                  update t1 set (f1, f2) = (t2.f1, t2.f2)

                  from t2 where t1.id = t2.f1;

                Такой способ работает, но я не представляю как подобным запросом обрабатывать связи таблиц источников.


                grgdvo



                Сообщ.
                #7

                ,
                23.03.16, 20:16

                  Member

                  **

                  Рейтинг (т): 21

                  Вы можете делать JOIN практически также как в SELECT. Например

                  ExpandedWrap disabled

                    update t1 set (f1, f2) = (t2.f1, t2.f2)

                    from t2, t3 where t1.id = t2.f1 and t2.f2 = t3.id;

                  ExpandedWrap disabled

                    update t1 set (f1, f2) = (t2.f1, t2.f2)

                    from t2 left join t3 on t2.f2 = t3.id where t1.id = t2.f1;

                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                  0 пользователей:

                  • Предыдущая тема
                  • Базы данных: SQL
                  • Следующая тема

                  Рейтинг@Mail.ru

                  [ Script execution time: 0,0571 ]   [ 15 queries used ]   [ Generated: 30.01.23, 16:30 GMT ]  

                  0 0 голоса
                  Рейтинг статьи
                  Подписаться
                  Уведомить о
                  guest

                  0 комментариев
                  Старые
                  Новые Популярные
                  Межтекстовые Отзывы
                  Посмотреть все комментарии

                  А вот еще интересные материалы:

                • Яшка сломя голову остановился исправьте ошибки
                • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
                • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
                • Ошибка синтаксиса примерное положение sql postgresql
                • Ошибка систем фан 90 b