|
|
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
Коллеги, добрый день! У меня есть такой набор данных, например: Код: plsql 1. Результат а, например: 3 7 11 Мне нужно сделать update поля "а" по rownum(т.е. значения поля "а" стали по порядку): 1 2 3 Такой вариант не прокатывает: Код: plsql 1. Помогите, плиз! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 08:29 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
iv_roman_vlТакой вариант не прокатывает: Код: plsql 1. RTFM MERGE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 08:30 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 08:36 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
iv_roman_vl Код: plsql 1. rownum формируется до сортировки. Для приведенного случая проще декодить id, чем городить подзапросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 08:37 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
Dshedoo, Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 08:39 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
Dshedoo, Спасибо!!! Работает!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 08:52 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за участие! Применил вышеуказанные способы и все работает! Но немного не нравится лаконничность решения. Задача звучит так: Книги лежат на полках. У каждой книги на полке есть свое место(номер места). Книги могут перемещать с полки на полку, либо в начало полки либо в конец. При перемещении книг в начало полки, номер места перемещаемых книг начинается с 1. Номер места уже имеющихся книг на полке начинается с количества добавленных книг на полку. При этом номера книг с полки откуда переместили, пересчитывается с 1. При перемещении книг в конец полки, номера книг имеющихся на полке остается прежним, а номера книг перемещаемых на полку начинается с количества книг присутствующих на полке. При этом номера книг с полки откуда переместили, пересчитывается с 1. Например: Код: sql 1. 2. 3. 4. 5. 6. 7. При перемещении книг 4,5 с полки 2 на полку 1 в начало полки : Код: sql 1. 2. 3. 4. 5. 6. 7. При перемещении книг 4,5 с полки 2 на полку 1 в конец полки : Код: sql 1. 2. 3. 4. 5. 6. 7. Я реализовал это так, начну Код: plsql 1. : Вначале нахожу количество книг на той полке на которую хочу переместить Код: plsql 1. Затем, перемещаю книги на полку: Код: plsql 1. 2. 3. 4. 5. 6. Локаничность тут меня устраивает. А теперь, Код: plsql 1. : Перенумеровываю места книг на полке откуда забираем книги: Код: plsql 1. 2. 3. 4. 5. 6. Далее, нахожу количество перемещаемых книг: Код: plsql 1. Далее, Перенумеровываю места книг на полке на которую хочу поставить книги начиная с количества перемещаемых книг: Код: plsql 1. 2. 3. 4. 5. 6. И в конце, перемещаем книги на полку 1: Код: plsql 1. 2. 3. 4. 5. 6. Меня не устраивает локанничность при перемещении в начало полки. Можно ли как то это записать одним запросом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 10:49 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
iv_roman_vlУ каждой книги на полке есть свое место(номер места).rownum тут не к месту. Поставить в конец - номер=max+1. Вытащить - номер=номер-1 для номеров с убранного. Вставить номер=номер+1 для номеров с вставленного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 11:05 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
iv_roman_vl, 1. не стоит использовать названия переменных такие же как и имена команд, и читать сложно, и проблемы могут возникнуть (into count) 2. не нашел перерасчет полки с которой сняли книги для "вставки в начало" ... если полка останется не сортированной на нее книги вернуть будет сложно 3. Для вставки в начало, я бы вставил записи с НомерКнигиНаПолке = 0 и прогнал один раз перенумерацию с сортировкой order by НомерКнигиНаПолке, id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 11:59 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
В процедуру надо передавать ID книг и их новые полки (new_polka) и места (new_mesto). 1) В курсоре выбираем книгу. 2) Запихиваем в old_polka и old_mesto текущее положение книги. 3) Апдейтим все книги на new_polke, у которых mesto >= new_mesto. set mesto = mesto+1 4) Апдейтим все книги на old_polke, у которых mesto > old_mesto. set mesto = mesto - 1. 5) Апдейтим книгу set mesto = new_mesto, polka = new_polka ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 12:25 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
DshedooВ процедуру надо передавать ID книг и их новые полки (new_polka) и места (new_mesto). 1) В курсоре выбираем книгу. 2) Запихиваем в old_polka и old_mesto текущее положение книги. 3) Апдейтим все книги на new_polke, у которых mesto >= new_mesto. set mesto = mesto+1 4) Апдейтим все книги на old_polke, у которых mesto > old_mesto. set mesto = mesto - 1. 5) Апдейтим книгу set mesto = new_mesto, polka = new_polka Выполнять пункты в такой последовательности: 1 - 2 - 3 - 5 - 4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 12:28 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
DshedooВ процедуру надо передавать ID книг и их новые полки (new_polka) и места (new_mesto). 1) В курсоре выбираем книгу. 2) Запихиваем в old_polka и old_mesto текущее положение книги. 3) Апдейтим все книги на new_polke, у которых mesto >= new_mesto. set mesto = mesto+1 4) Апдейтим все книги на old_polke, у которых mesto > old_mesto. set mesto = mesto - 1. 5) Апдейтим книгу set mesto = new_mesto, polka = new_polka Я так понимаю, что если у нас перемещаются три книги, то действия 2,3,4,5 будут повторятся по три раза. Этот вариант хорошо подходит если у нас книга может, например из центра полки переместится в другой центр полки. У меня такого случая быть не может. У меня книги строго, либо в конец либо в начало. А старая полка в порядке очередности просто пересчитывается. То есть книги на старой полке просто "сдвинули" друг к другу. И предложенный вариант будет избыточный, так как надо будет пункты 2,3,4,5 повторять для каждой книги. Все равно спасибо за участие. Я понял, что мой метод имеет место быть. Просто меня интересовало, могу ли я два запроса(1-й пересчет от количества перемещаемых книг, 2 - пересчет перемещаемых книг) при перемещении в голову обьеденить в один. Видимо нет. Но все равно всем спасибо. PS: про имя into count знаю. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 13:27 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
iv_roman_vlПросто меня интересовало, могу ли я два запроса(1-й пересчет от количества перемещаемых книг, 2 - пересчет перемещаемых книг) при перемещении в голову обьеденить в один. Видимо нет. Ну от чего же сразу нет. Можно написать 1 мердж который основан на сортировке НомерКнигиНаПолке а потом ID по передаваемому значению НомерПолки. А вставка будет апдейтить НомерПолки на нужную, в начало меняет НомерКнигиНаПолке = 0 для вставляемых книг в конец меняет НомерКнигиНаПолке переводит в null После запускаем наш единственный мердж который и пересчитает НомерКнигиНаПолке для старой а потом и для новой полки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 14:00 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
iv_roman_vl, перемещения в "однопользовательском" режиме? ps Вы хотите одним merge убрать книги из полки и положить на другую с перенумерациями? или оператора два - один знимает книги с полки, другой кладет с перенумерациями? ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 14:02 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
Staxiv_roman_vl, перемещения в "однопользовательском" режиме? ps Вы хотите одним merge убрать книги из полки и положить на другую с перенумерациями? или оператора два - один знимает книги с полки, другой кладет с перенумерациями? ..... stax Да, в однопользовательском. Да, одним merge. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 14:39 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
iv_roman_vl, книги снимаются с одной полки, или могут сниматся сразу из нескольких? все снятые книги ставятся на одну конкретную полку? ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 15:00 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
Staxiv_roman_vl, книги снимаются с одной полки, или могут сниматся сразу из нескольких? все снятые книги ставятся на одну конкретную полку? ..... stax За одну операцию(одного нажатии на кнопку переместить) Книги снимаются только с одной полки. И ставятся только на одну полку(строго либо в начало полки, либо в конец). И вопрос в том можно ли сделать перенос книг с одной полки на другую, с соответствующим пересчетом на обеих полках, при вставке в начало полки, одним запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 15:09 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
iv_roman_vl, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 15:22 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
Это я перевожу книги 1 и 2 с полки 1 на полку 2 перерасчитывая две полки (ну их всего две ) где: Код: plsql 1. - 1 - с начала, 2-ка например с конца Код: plsql 1. - полка на которую перенесли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 15:26 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
iv_roman_vlStaxiv_roman_vl, книги снимаются с одной полки, или могут сниматся сразу из нескольких? все снятые книги ставятся на одну конкретную полку? ..... stax За одну операцию(одного нажатии на кнопку переместить) Книги снимаются только с одной полки. И ставятся только на одну полку(строго либо в начало полки, либо в конец). И вопрос в том можно ли сделать перенос книг с одной полки на другую, с соответствующим пересчетом на обеих полках, при вставке в начало полки, одним запросом. Так вот "одной кнопкой" ты можешь вызывать процедуру, которая и будет делать всё, что я описал ранее. Правильнее реализовывать не тот подход, который решает конкретную задачу, а тот, который будет универсален, и будет, в том числе, решать конкретную задачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 15:45 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
iv_roman_vl, влоб Код: 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. .... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 16:00 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
Stax, Спасибо, это именно то что нужно!!!!!!!!!!!!!!!!!! Скрипт ОГОНЬ!!! ОГРОМНЫЙ РЕСПЕКТ!!! чувствую как мой скил прокачался!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 16:52 |
|
||
|
select в updete вставить rownum
|
|||
|---|---|---|---|
|
#18+
iv_roman_vl, можно сделать и оптимальнее (без/меньше union all), условие выборки будет запутанее делал влоб, чтоб понятнее было ps снятие книг с нескольких полок одновременно p in (select p from t where id in (4,5)) ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2018, 17:04 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39593943&tid=1884497]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
23ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 361ms |

| 0 / 0 |
