|
Автоинкрементный столбец в представлении
|
|||
---|---|---|---|
#18+
Добрый день! Господа, проблема такая: есть таблица, где хранится ежедневная выработка продукции, при чем по сменам. Вид упрощенно такой: Код: plaintext
Где issue_amount - собственно, величина выработки, issue_date - дата выработки, issue_shift - смена, которая выработала продукцию (может быть 1 или 2), issue_prod_id - идентификатор продукции (FK). Создаю представление (VIEW), которое отображает сумму выработки всей продукции посменно (и по датам, соотв-но). Например, исходные данные такие: Число: 01.10. Первая смена: Аммиак - 350, Лактам - 1000. Вторая смена: Аммиак - 400, Лактам - 500. Число: 02.10. Первая смена: Аммиак - 250, Лактам - 800. Вторая смена: Аммиак - 500, Лактам - 700. В представлении у меня будет след. информация: Код: plaintext 1. 2. 3. 4. 5.
Вопрос такой: как в этом представлении добавить автоинкрементное поле? Это нужно для отображения очередности смен, т.е. 1-я смена 01.10 была раньше, чем 2-я 01.10. А 2-я смена 01.10, соотв, раньше, чем 1-я 02.10. Иными словами. VIEW должен иметь такой вид: Код: plaintext 1. 2. 3. 4. 5.
Есть ли какая-нибудь для этого функция? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2003, 10:57 |
|
Автоинкрементный столбец в представлении
|
|||
---|---|---|---|
#18+
Возникла идея сделать SEQUENCE и выводить во VIEW его nextval. Но в этом случае с каждой выборкой из VIEW нумерация возрастает на количество имеющихся записей. Т.е. SELECT первый раз даст хорошую картину: Код: plaintext 1. 2. 3. 4. 5.
Еще одна выборка: Код: plaintext 1. 2. 3. 4. 5.
И т.д. Что не есть гуд, так как с учетом того, что таблица регулярно пополняется, а представление еще более регулярно просматривается, то числа будут расти в хз какой последовательности (явно не арифметической и даже не геометрической)... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2003, 13:15 |
|
Автоинкрементный столбец в представлении
|
|||
---|---|---|---|
#18+
Если хочешь использовать сиквенс, то поставь триггер на вьюху, которая перед доступом обнуляет этом сиквенс ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2003, 14:16 |
|
Автоинкрементный столбец в представлении
|
|||
---|---|---|---|
#18+
По поводу счетчика - в where наверное можно вставить ф-ю, сбрасывающую значение (вызывающую setval('sequence_name', 1)) (как это со статич. перем. в Аксесе). Тут надо проверить, сколько раз вызывается в Where ф-я (или любое другое условие), не передающая значения полей. Но это плёхо - а если нескоко юзерей поюзают счетчик (отдается ли счетчик всем по мере надобности, или только по очереди захватывается некими процессами-запросами)? Тогда даже проинициализированный счетчик выдаст разрывы. Есть агрегатные ф-ии. Но их нельзя юзать в обычном запросе. Только через подчиненный группирующий. Что (обычно) приводит к квадратичному росту времени счета. Опять таки, если есть предложение ORDER By, то будут ли nextval вызываться в порядке, соответствующим окончательному порядку сортировки? (что раньше - сортировка, или выборка). И хде наши гуру? Ау! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2003, 14:17 |
|
Автоинкрементный столбец в представлении
|
|||
---|---|---|---|
#18+
Vel: Если хочешь использовать сиквенс, то поставь триггер на вьюху, которая перед доступом обнуляет этом сиквенс Была идея :), но триггер на view не повесишь, да и событие SELECT триггер не прожует.. :( Vel: Опять таки, если есть предложение ORDER By, то будут ли nextval вызываться в порядке, соответствующим окончательному порядку сортировки? (что раньше - сортировка, или выборка). ORDER BY стоит во VIEW и сортирует по дате, потом по смене. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2003, 14:25 |
|
Автоинкрементный столбец в представлении
|
|||
---|---|---|---|
#18+
по поводу триггера на select - было отчень подозрительно :). А вот по сбросу в where пока не проверил. Все остально - "it depends..." ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2003, 15:19 |
|
Автоинкрементный столбец в представлении
|
|||
---|---|---|---|
#18+
ну если не катит триггер (хотя у меня вроде катил), то перед select делай обнуление вручную. Если с nextvalом не катит order, то селект делай в темповую таблицу. а оттуда показывай. Разница в скорости будет очень мала, с учетом того, что из темповой таблицы все будет браться как селект *. И чтобы не писать каждый раз кучу запросов, все оформляем в функцию и возвращаемым результатом - темповая таблица. У каждого юзверя она будем своя. Прыгать значения не будут. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2003, 16:05 |
|
Автоинкрементный столбец в представлении
|
|||
---|---|---|---|
#18+
create sequence s_issue minvalue 0; create view v_issue as select nextval('s_issue') as ordr, a.* from ( select sum(issue_amount) as issue_amount, issue_date, issue_shift from issue group by issue_date, issue_shift order by issue_date, issue_shift ) as a, setval('s_issue',0) as b; ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2003, 13:14 |
|
Автоинкрементный столбец в представлении
|
|||
---|---|---|---|
#18+
Господа, всем спасибо. В проблеме разобрался (в т.ч. и с помощью предложенных здесь советов). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2003, 14:58 |
|
Автоинкрементный столбец в представлении
|
|||
---|---|---|---|
#18+
Очень интересно, как вы ее решили, потому что 1) сам давно задавался подобным вопросом, 2) способ предложенный мною кажется не совсем корректным потому что вроде бы может "сломаться" при смене плана выполнения запроса (где гарантия что setval выполнится перед nextval-ами). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2003, 15:29 |
|
|
start [/forum/topic.php?fid=53&msg=32281862&tid=2008112]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 269ms |
total: | 535ms |
0 / 0 |