Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Order by по обновлению строки / 25 сообщений из 25, страница 1 из 1
26.10.2017, 10:39
    #39542203
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
Есть поле в котором содержится несколько одинаковых значений. Например:
Код: 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
26.10.2017, 10:45
    #39542211
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
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
26.10.2017, 10:56
    #39542220
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
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
26.10.2017, 11:03
    #39542226
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
На самом деле, больше 1 дубликата в таблице не будет
...
Рейтинг: 0 / 0
26.10.2017, 11:12
    #39542234
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
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
26.10.2017, 11:13
    #39542235
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
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
26.10.2017, 11:19
    #39542242
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
Stax,
Вообще, в таблице больше одного дубликата не будет я имел ввиду
Например:
Код: plsql
1.
2.
3.
4.
5.
row code
1      1
2      1
3      2
4      3
...
Рейтинг: 0 / 0
26.10.2017, 11:24
    #39542245
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
Либо
Код: plsql
1.
2.
3.
4.
5.
row code
1      1
2      2
3      2
4      3


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

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


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

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

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

.....
stax
...
Рейтинг: 0 / 0
26.10.2017, 13:16
    #39542391
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
Вот более подробно: есть таблица 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
26.10.2017, 14:47
    #39542526
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
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
26.10.2017, 14:58
    #39542540
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
Алгоритм вы поняли правильно. Нужно написать апдейт который правильно отсортирует код в таблице при её модификации.
Staxя так понимаю
если коде поменяли на меньшее, то надо ставить первым,
если на большее то последним

.....
stax
...
Рейтинг: 0 / 0
26.10.2017, 15:14
    #39542554
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
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
26.10.2017, 15:28
    #39542569
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
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
26.10.2017, 15:32
    #39542575
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
не учитывая 9й айди не заметил что там 7
...
Рейтинг: 0 / 0
26.10.2017, 15:53
    #39542594
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
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
26.10.2017, 16:12
    #39542628
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
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
26.10.2017, 16:18
    #39542643
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
Id может не совпадать с code
...
Рейтинг: 0 / 0
26.10.2017, 17:26
    #39542728
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
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
27.10.2017, 11:19
    #39543076
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
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
27.10.2017, 12:35
    #39543166
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Order by по обновлению строки
Viacheslav.demStax,
Большое спасибо очень помогли, все работает!
Только не понятно для чего нужен был подзапрос в конструкции where. Попробовал вот так тоже отлично работает.

перемудрил

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

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

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

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

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

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


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