Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / update & order by / 8 сообщений из 8, страница 1 из 1
05.12.2008, 19:45
    #35697213
tadmin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update & order by
необходимо пронумеровать записи в таблице 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
05.12.2008, 22:02
    #35697369
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update & order by
tadmin пишет:

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

Нет вообще никакого средства на это повлиять.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
06.12.2008, 05:08
    #35697533
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update & order by
повлиять на порядок 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
06.12.2008, 13:59
    #35697714
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update & order by
Ёш пишет:
> повлиять на порядок update наверное нельзя,

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

2 MasterZiv - ну, вы же понимаете, что у меня влияние на порядок update не цель а средство?
Может и негодное, но другого я не видел.
...
Рейтинг: 0 / 0
06.12.2008, 17:47
    #35697878
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update & order by
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
06.12.2008, 18:38
    #35697929
tadmin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update & order by
MasterZiv
update tab
set t = ( select count(*) + 1 from tab lt where lt.X < tab.X )

у меня в поле X не уникальное, да еще и null есть (я их в конец запихиваю).
Так что и в нумерации совпадения пойдут.
...
Рейтинг: 0 / 0
06.12.2008, 18:43
    #35697935
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update & order by
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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / update & order by / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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