|
|
|
Выборка строк без временной таблицы
|
|||
|---|---|---|---|
|
#18+
Добрый день, господа. Была у меня достаточно простая задача: дана таблица, в которой есть столбец ROW_NUMBER с номерами строк (т.е. в этой таблице мы можем говорить о предыдущей/следующей строке). Было нужно пройти по этой таблице и удалить те строки, в которых поле ID было аналогично полю ID предыдущей строки. Как я это сделал: перекачал данные с упорядочиванием по ROW_NUMBER во временную таблицу, организовал цикл по возрастанию ROW_NUMBER в этой таблице и, сравнивая ID текущей и предыдущей строки, удалил ненужные строки. В общем, ничего сложного. Но возникла проблема - на базе, для которой будет использоваться этот запрос, нельзя создавать временные таблицы. При этом удалять строки из основной таблицы, понятно, не вариант. И вот встает вопрос: можно ли организовать подобную выборку без временной таблицы, просто по селекту из основной таблицы? Технически, так как в выборке по селекту будет порядковый номер строки ROW_NUMBER, я смогу в цикле находить для сравнения "текущую" и "предыдущую" строки, но вот каким образом их хранить, если нельзя складывать во временную таблицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2014, 10:40:09 |
|
||
|
Выборка строк без временной таблицы
|
|||
|---|---|---|---|
|
#18+
а каким образом вы добились, чтобы при разных роу-намбер были одинаковые айди? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2014, 10:41:44 |
|
||
|
Выборка строк без временной таблицы
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, ну, это не я добивался :) Смысл всей таблицы в том, что она по сути отражает один и тот же промышленный объект. У этого объекта время от времени меняется ID, под которым он числится в документах. Новая строка с состоянием добавляется каждый месяц. Значение ID может не изменяться много месяцев подряд, и в такие периоды идут одинаковые строки, только поле ROW_NUMBER и меняется. В результате найти моменты, когда ID изменяется, очень тяжело - в этой таблице уже 30.000+ строк. Собственно, мой запрос с отбором строк был для того и нужен, чтобы вычленить моменты, когда ID этого промышленного объекта меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2014, 10:53:48 |
|
||
|
Выборка строк без временной таблицы
|
|||
|---|---|---|---|
|
#18+
select * from table1 a left join table1 b on(a.row = b.row+1) where a.id <> b.id дожин дайт нам таблицу вида поля для роу Н строки + поля для строки роу=Н+1 (следующая) берём только те, где айди стал другим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2014, 11:19:35 |
|
||
|
Выборка строк без временной таблицы
|
|||
|---|---|---|---|
|
#18+
а в целом конечно же и лудше и надо и правильно раз встал вопрос. перестать заниматься черчи чем. есть обьект с айди. который меняеться. надо таблица текущего состояния, таблица изменений. роу что означает не совсем ясно, да бог сним. каждый месяц мы не вставляем, а обновляем текущее состояние. тригером на афтер(сработает только если чтото действительно изменилось) делаем вставку в историю изменений - аля все поля нулл, только там где значения изменились - новые значения. тогда получить все изменения поля А за период определёного месяца ВЫБРАТЬ дату, поле А ИЗ история_изменений ГДЕ дата между началом и концом нужного месяца И полеА ЕСТЬ НЕ НУЛЛ получим только те записи, которые отображают изменения именно поля А(возможно ещо какихто) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2014, 11:23:49 |
|
||
|
Выборка строк без временной таблицы
|
|||
|---|---|---|---|
|
#18+
alex564657498765453select * from table1 a left join table1 b on(a.row = b.row+1) where a.id <> b.id Попробую, тоже были мысли джойнить. alex564657498765453надо таблица текущего состояния, таблица изменений Это уже скорее вопрос к заказчику, который не разрешает создавать новые и временные таблицы, хотя сам ни черта не делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2014, 11:29:25 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38740310&tid=1834260]: |
0ms |
get settings: |
6ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
56ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 330ms |

| 0 / 0 |
