powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Order by по обновлению строки
25 сообщений из 25, страница 1 из 1
Order by по обновлению строки
    #39542203
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть поле в котором содержится несколько одинаковых значений. Например:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
row  code
 1     1
 2     1
 3     2
 4     2
 5     3
 6     3


Нужно отсортировать данные так, чтобы при обновлении строки (row) 3 с код 2 на код 1 она поднималась на 1-ю строку. Т.е при модификации данных отсортировать по последнему обновлению записи. Должен получится такой вид:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
row code
3      1
1      1
2      1
4      2
5      3
6      3


Но если изменить строку (row) 2 ,из первой таблицы, на код 2, то наоборот эту запись поставить на последнюю позицию т.е таблица должна стать такого вида:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
row  code
 1     1
 3     2
 4     2
 2     2
 5     3
 6     3
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542211
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem,

в тригере сохраняйте старое значение

Код: plsql
1.
2.
3.
4.
5.
6.
7.
row code
3      1
1      1
2      1
4      2
5      3
6      3



если 3 1 снова заменить на 3 2 то как отсортируется?

.....
stax
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542220
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
row code
1      1
2      1
4      2
3      2
5      3
6      3
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542226
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На самом деле, больше 1 дубликата в таблице не будет
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542234
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem,
Код: plsql
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
SQL> ed
Wrote file afiedt.buf

  1  with t(r,code,old) as (
  2  select 1,     1,null from dual union all
  3  select 2,     2,1 from dual union all
  4  select 3,     1,2 from dual union all
  5  select 4,     2,null from dual union all
  6  select 5,     3,null from dual union all
  7  select 6,     3,null from dual )
  8* select * from t order by code,code-nvl(old,code)
SQL> /

         R       CODE        OLD
---------- ---------- ----------
         3          1          2
         1          1
         4          2
         2          2          1
         6          3
         5          3

6 rows selected.

SQL> ed
Wrote file afiedt.buf

  1  with t(r,code,old) as (
  2  select 1,     1,null from dual union all
  3  select 2,     2,1 from dual union all
  4  select 3,     2,1 from dual union all
  5  select 4,     2,null from dual union all
  6  select 5,     3,null from dual union all
  7  select 6,     3,null from dual )
  8* select * from t order by code,code-nvl(old,code)
SQL> /

         R       CODE        OLD
---------- ---------- ----------
         1          1
         4          2
         2          2          1
         3          2          1
         5          3
         6          3

6 rows selected.

SQL>



.....
stax
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542235
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.demНа самом деле, больше 1 дубликата в таблице не будет

Код: plsql
1.
2.
3.
4.
5.
6.
7.
row code
3      1
1      1
2      1
4      2
5      3
6      3



три единички

.....
stax
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542242
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Вообще, в таблице больше одного дубликата не будет я имел ввиду
Например:
Код: plsql
1.
2.
3.
4.
5.
row code
1      1
2      1
3      2
4      3
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542245
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Либо
Код: plsql
1.
2.
3.
4.
5.
row code
1      1
2      2
3      2
4      3


Тоесть имеется только один дубликат.
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542328
Pavel_PV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алгоритм не ясен.

Имеет ли значение строка которая была в row. Исходя из условия если row уменьшилась(3->2), то она должна быть первой в списке в рамках нового code, а если row увеличилась или осталось неизменной то она должна быть последней в списке. Верно?
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542337
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.demЛибо
Код: plsql
1.
2.
3.
4.
5.
row code
1      1
2      2
3      2
4      3


Тоесть имеется только один дубликат.

по любому для сортировки нужны "старое" значение и временная метка (или затирать "устаревшее"),

я так понимаю
если коде поменяли на меньшее, то надо ставить первым,
если на большее то последним

.....
stax
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542391
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот более подробно: есть таблица test с полями
Код: plsql
1.
2.
3.
4.
id  code
1    1
2    2
3    3


При
Код: plsql
1.
update test set code=1 where id=2;


получаем
Код: plsql
1.
2.
3.
4.
id   code
1    1
2    1
3    3


сортировка при таком варианте должна выглядеть так:
Код: plsql
1.
2.
3.
4.
id   code
2    1
1    1
3    3



А задача состоит чтобы обновить code в таблице с 1..n, с шагом один по указанной выше сортировке, т.е:
Код: plsql
1.
2.
3.
4.
id   code
2     1
1     2
3     3



Это пример когда меняется код с большего на меньшее.
Когда наоборот, если брать последний пример
Код: plsql
1.
update test set code=3 where id=2;


получаем
Код: plsql
1.
2.
3.
4.
id   code
2     3
1     2
3     3 



при сортировке должны получить
Код: plsql
1.
2.
3.
4.
id   code
1     2
3     3
2     3



Далее обновляем с 1..n, т.е:
Код: plsql
1.
2.
3.
4.
id     code
1       1
3       2
2       3
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542526
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem
А задача состоит чтобы обновить code в таблице с 1..n, с шагом один по указанной выше сортировке, т.е:

[/src]
ничего не понял

Вот более подробно: есть таблица test с полями
Код: plsql
1.
2.
3.
4.
5.
6.
7.
id  code
1    1
2    2
3    3
7    6
8    9
9    7



что надо
1) обновить code в таблице (написать update ...) с учетом ...
2) прописать сортировку (select ... order by ...) которая б учитывала update ...

.....
stax
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542540
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алгоритм вы поняли правильно. Нужно написать апдейт который правильно отсортирует код в таблице при её модификации.
Staxя так понимаю
если коде поменяли на меньшее, то надо ставить первым,
если на большее то последним

.....
stax
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542554
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.demНужно написать апдейт который правильно отсортирует код в таблице при её модификации.
Staxя так понимаю
если коде поменяли на меньшее, то надо ставить первым,
если на большее то последним

.....
stax

уже чуть теплее (нужен update)

апдейт не может сортировать (иот не рассматриваем), он меняет поля в строке/строках, но не упорядочивает их


если грубо то в оракле за сортировку отвечает order by

отсюда не совсем понятно
есть таблица test с полями
Код: plsql
1.
2.
3.
4.
5.
6.
7.
id  code
1    1
2    2
3    3
7    6
8    9
9    7



что должно произойти в случаях если меняем code

1) c 6 на 2
2) c 6 на 9
?

.....
stax
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542569
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
id  code
1    1
7    2
2    3
3    4
8    5
9    6


2.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
id  code
1    1
2    2
3    3
8    4
7    5
9    6
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542575
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не учитывая 9й айди не заметил что там 7
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542594
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem,

о уже чуть проясняетя
в таблице id любое число,
code от 1 до n, без дырок
code порядковий номер id?

состояние
Код: plsql
1.
2.
3.
4.
5.
6.
7.
id  code
1    1
2    2
3    3
7    6
8    9
9    7


недопустимо, есть дырки
для удобства надо вивод сортировать по коде

задача
про смене одного коде, поменять (переномеровать) и другие коды (некоторие пары id-code поменяются) с учетем на что меняем (>,<)

два параметра
1) какой коде меняем (1-n)
2) на что меняем (1-n)

так?
.....
stax
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542628
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Вроде так. Изначально в коде дырок не будет т.е от 1 до n с шагом один.

пример:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
id    code
1       1
2       2
3       3
4       4
5       5
6       6



В случае если меняем code 5 на 2, тогда:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
id    code
1       1
5       2
2       3
3       4
4       5
6       6



В случае если меняем code 2 на 5 (с самой верхней таблицы), тогда

Код: plsql
1.
2.
3.
4.
5.
6.
7.
id     code
1        1
3        2
4        3
5        4
2        5
6        6
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542643
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Id может не совпадать с code
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39542728
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem,

параметры не проверяю с (1 по н)

Код: plsql
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
SQL> select * from t order by code;

        ID       CODE
---------- ----------
         1          1
         2          2
         3          3
         4          4
         5          5
         6          6
         7          7
         8          8
         9          9

9 rows selected.

SQL> exec :z:=4;

PL/SQL procedure successfully completed.

SQL> exec :na:=2;

PL/SQL procedure successfully completed.

SQL> update t set code=decode(code,:z,:na,code+sign(:z-:na))
  2  where code in (
  3  select t1.code from t t1
  4  where t1.code>=least(:z,:na) and t1.code<=greatest(:z,:na)
  5  )
  6  /

3 rows updated.

SQL> select * from t order by code;

        ID       CODE
---------- ----------
         1          1
         4          2
         2          3
         3          4
         5          5
         6          6
         7          7
         8          8
         9          9

9 rows selected.

SQL> rollback;

Rollback complete.

SQL> exec :na:=7;

PL/SQL procedure successfully completed.

SQL> update t set code=decode(code,:z,:na,code+sign(:z-:na))
  2  where code in (
  3  select t1.code from t t1
  4  where t1.code>=least(:z,:na) and t1.code<=greatest(:z,:na)
  5  )
  6  /

4 rows updated.

SQL> elect * from t order by code;
SP2-0734: unknown command beginning "elect * fr..." - rest of line ignore
SQL> select * from t order by code;

        ID       CODE
---------- ----------
         1          1
         2          2
         3          3
         5          4
         6          5
         7          6
         4          7
         8          8
         9          9

9 rows selected.

SQL> rollback;

Rollback complete.

SQL> exec :na:=4;

PL/SQL procedure successfully completed.

SQL> update t set code=decode(code,:z,:na,code+sign(:z-:na))
  2  where code in (
  3  select t1.code from t t1
  4  where t1.code>=least(:z,:na) and t1.code<=greatest(:z,:na)
  5  )
  6  /

1 row updated.

SQL> select * from t order by code;

        ID       CODE
---------- ----------
         1          1
         2          2
         3          3
         4          4
         5          5
         6          6
         7          7
         8          8
         9          9

9 rows selected.

SQL> rollback;

Rollback complete.

SQL>



.....
stax
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39543076
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Большое спасибо очень помогли, все работает!
Только не понятно для чего нужен был подзапрос в конструкции where. Попробовал вот так тоже отлично работает.
Код: plsql
1.
2.
update test set code=decode(code,:z,:na,code+sign(:z-:na))
 where code>=least(:z,:na) and code<=greatest(:z,:na);


Не могли бы вы еще помочь разобраться с вот этим вопросом 20897699
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39543166
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.demStax,
Большое спасибо очень помогли, все работает!
Только не понятно для чего нужен был подзапрос в конструкции where. Попробовал вот так тоже отлично работает.

перемудрил

мой изначальный update был сильно корявый

.....
stax
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39543193
Болезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax, а доменный индекс почему не попробовал? Вроде как раз в тему.
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39543204
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БолезныйStax, а доменный индекс почему не попробовал? Вроде как раз в тему.

для меня пока сложновато

я и так простой update c лишним подзапросом состряпал

да и что надо Вечеславу, не сразу допер

....
stax
...
Рейтинг: 0 / 0
Order by по обновлению строки
    #39543243
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Болезный,
можно поподробнее?
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Order by по обновлению строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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