powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Апдейт не выполняется.
7 сообщений из 7, страница 1 из 1
Апдейт не выполняется.
    #40000761
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

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

Код: sql
1.
2.
3.
4.
5.
UPDATE plan
SET time = r.time
FROM plan p
JOIN (SELECT plan_id, MIN (time) time FROM plan_review GROUP BY plan_id) r
ON p.id = r.plan_id



А вот такой же select работает очень быстро.

Код: sql
1.
2.
3.
SELECT * FROM plan p
JOIN (SELECT plan_id, MIN (time) time FROM plan_review GROUP BY plan_id) r
ON p.id = r.plan_id



Я не очень знаком с PostreSQL. Подскажите, пжлста, в чем может быть причина?
...
Рейтинг: 0 / 0
Апдейт не выполняется.
    #40000783
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,

авторUPDATE plan
SET time = r.time
FROM plan p
Документацию потому что не читаете. Там прямым текстом сказано
Do not repeat the target table as a from_item unless you intend a self-join
...
Рейтинг: 0 / 0
Апдейт не выполняется.
    #40000790
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij
Roust_m,

авторUPDATE plan
SET time = r.time
FROM plan p

Документацию потому что не читаете. Там прямым текстом сказано
Do not repeat the target table as a from_item unless you intend a self-join

Хорошо, а как же мне сделать апдейт с джоином на другую таблицу в таком случае?
...
Рейтинг: 0 / 0
Апдейт не выполняется.
    #40001127
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m
Melkij
Roust_m,

пропущено...

Документацию потому что не читаете. Там прямым текстом сказано
пропущено...


Хорошо, а как же мне сделать апдейт с джоином на другую таблицу в таком случае?


Код: sql
1.
2.
3.
4.
UPDATE plan p
SET time = r.time
FROM (SELECT plan_id, MIN (time) time FROM plan_review GROUP BY plan_id) r
where p.id = r.plan_id
...
Рейтинг: 0 / 0
Апдейт не выполняется.
    #40001156
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court
Roust_m
пропущено...


Хорошо, а как же мне сделать апдейт с джоином на другую таблицу в таком случае?


Код: sql
1.
2.
3.
4.
UPDATE plan p
SET time = r.time
FROM (SELECT plan_id, MIN (time) time FROM plan_review GROUP BY plan_id) r
where p.id = r.plan_id



Спасибо, а как переписать запрос, где к основной таблице джоинятся две или более других таблиц, например как этот:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
UPDATE lplan lp 
SET position = 4
FROM lplan lp 
 join plan p
 on p.id = lp.act
 join revision r
 on lp.id = r.lp
 join approval a
 on r.id = a.rev
where approvalneeded = 1 and position = 0



Я больше по сиквелу специализируюсь, там такие запросы стандартны. А тут с Постгресом пришлось работать.
...
Рейтинг: 0 / 0
Апдейт не выполняется.
    #40001162
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
UPDATE lplan lp 
SET position = 4
FROM lplan lp 
 join plan p
 on p.id = lp.act
 join revision r
 on lp.id = r.lp
 join approval a
 on r.id = a.rev
where approvalneeded = 1 and position = 0




Я больше по сиквелу специализируюсь, там такие запросы стандартны. А тут с Постгресом пришлось работать.
нуу, для МСа ты тоже не правильно написал
Этого lplan (выделил) быть не должно

в ПГ будет как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE lplan lp 
SET position = 4
FROM plan p 
 join revision r
 on 1 = 1
 join approval a
 on r.id = a.rev
where approvalneeded = 1 and position = 0 and p.id = lp.act and lp.id = r.lp


общее правило : условия по обновляемой таб. (в том числе условия джойна) задаются в where
...
Рейтинг: 0 / 0
Апдейт не выполняется.
    #40001165
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court

в ПГ будет как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE lplan lp 
SET position = 4
FROM plan p 
 join revision r
 on 1 = 1
 join approval a
 on r.id = a.rev
where approvalneeded = 1 and position = 0 and p.id = lp.act and lp.id = r.lp


общее правило : условия по обновляемой таб. (в том числе условия джойна) задаются в where


для простоты можно
Код: sql
1.
2.
3.
4.
UPDATE lplan lp 
SET position = 4
FROM plan p, revision r, approval a
where approvalneeded = 1 and position = 0 and p.id = lp.act and lp.id = r.lp and  r.id = a.rev


но если там 20 joins конечно лучше так не делать а то не ясно кто на ком стоял без поллитры.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Апдейт не выполняется.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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