powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / update & order by
8 сообщений из 8, страница 1 из 1
update & order by
    #35697213
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
необходимо пронумеровать записи в таблице tab в порядке возрастания по полю X, в таблице tab есть PK - tab_pk

Действую так:

Код: plaintext
1.
2.
3.
4.
5.
setval('tmp_ArticleSearch_seq', 1 );

update tab set t=nextval('tmp_ArticleSearch_seq')
from (select  tab_pk from tab 
order by X) as TT
where tab.tab_pk = TT.tab_pk

Но моя сортировка никак не влияет.
Есть другое средство повлиять на порядок выполнения update?
...
Рейтинг: 0 / 0
update & order by
    #35697369
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin пишет:

> Но моя сортировка никак не влияет.
> Есть другое средство повлиять на порядок выполнения update?

Нет вообще никакого средства на это повлиять.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
update & order by
    #35697533
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
повлиять на порядок update наверное нельзя, но можно указать какие строки какими значениями обновлять. tadmin , Вам нужен более глубоко вложеный подзапрос.
"Взять все значения из tab, отсортировать их в нужном порядке, приписать в результате к каждой строке её порядковый номер. обновить в tab все строки, записав в t порядковый номер из вышеупомянутого подзапроса" как-то так:
Код: plaintext
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.
begin;
seb=> create table tab (tab_pk serial primary key, x text, t int);
seb=> select * from tab;
 tab_pk | x | t
--------+---+---
       1  | b |
       2  | c |
       3  | a |
( 3  rows)
seb=> create temp sequence g;

seb=> update tab set t = x.g from (
  select *, nextval('g') as g from (
    select * from tab order by x
  ) as x
) as x where tab.tab_pk = x.tab_pk;

seb=> select * from tab;
 tab_pk | x | t
--------+---+---
       3  | a |  1 
       1  | b |  2 
       2  | c |  3 
( 3  rows)
seb=> EXPLAIN update tab set t = x.g from (select *, nextval('g') as g from (select * from tab order by x) as x) as x where tab.tab_pk = x.tab_pk;
                                QUERY PLAN
--------------------------------------------------------------------------
 Hash Join  (cost= 116 . 74 .. 164 . 59  rows= 1160  width= 50 )
   Hash Cond: (x.tab_pk = tt.tab.tab_pk)
   ->  Subquery Scan x  (cost= 80 . 64 .. 98 . 04  rows= 1160  width= 40 )
         ->  Sort  (cost= 80 . 64 .. 83 . 54  rows= 1160  width= 40 )
               Sort Key: tt.tab.x
               ->  Seq Scan on tab  (cost= 0 . 00 .. 21 . 60  rows= 1160  width= 40 )
   ->  Hash  (cost= 21 . 60 .. 21 . 60  rows= 1160  width= 42 )
         ->  Seq Scan on tab  (cost= 0 . 00 .. 21 . 60  rows= 1160  width= 42 )
( 8  rows)
commit;
минус - трёхкратный (по сути) просмотр таблицы.

если вносить nextval в подзапрос с order - то nextval выполнится ДО сортировки и будет не то что Вам нужно, если выносить наружу - то порядок его вызова вообще не понятен (как сказал выше MasterZiv )...


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
update & order by
    #35697714
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёш пишет:
> повлиять на порядок update наверное нельзя,

На порядок изменения строк влиять либо невозможно,
либо, если и возможно, то вредно в 90% случаев.
Вредно в смысле идеологии. Надо реляционными операциями
работать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
update & order by
    #35697758
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Ёш - спасибо, понял. У меня табличка небольшая, так что выходит быстро.

2 MasterZiv - ну, вы же понимаете, что у меня влияние на порядок update не цель а средство?
Может и негодное, но другого я не видел.
...
Рейтинг: 0 / 0
update & order by
    #35697878
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin пишет:

> необходимо пронумеровать записи в таблице tab в порядке возрастания по
> полю X, в таблице tab есть PK - tab_pk

update tab
set t = ( select count(*) + 1 from tab lt where lt.X < tab.X )

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
update & order by
    #35697929
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
update tab
set t = ( select count(*) + 1 from tab lt where lt.X < tab.X )

у меня в поле X не уникальное, да еще и null есть (я их в конец запихиваю).
Так что и в нумерации совпадения пойдут.
...
Рейтинг: 0 / 0
update & order by
    #35697935
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin пишет:

> у меня в поле X не уникальное, да еще и null есть (я их в конец запихиваю).
> Так что и в нумерации совпадения пойдут.
Тогда упорядочивайте ещё и по другим полям, например, по ключу:
update tab
set t = ( select count(*) + 1
from tab lt
where lt.X < tab.X
and lt.tab_pk < tab.tab_pk )
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / update & order by
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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