Как создать последовательность Oracle, запускающуюся с макс. значения от таблицы?

Вот как вы можете получать данные, за исключением дней недели:

select t2.EmployeeID, EmployeeName, MonHours, lunchtotal + sum(Clock.ClockOut - Clock.ClockIn) as MonBreak
from
(
select t.EmployeeID, EmployeeName, MonHours, sum(Lunch.ClockOut - Lunch.ClockIn) as lunchtotal
from
(
select Employee.EmployeeID concat(FirstName, ' ', LastName) as EmployeeName, sum(Hours.ClockOut - Houts.ClockIn) as MonHours
from Employee
join Hours on Employee.EmployeeID = Hours.EmployeeID
group by Employee.EmployeeID
) t
join Lunch on t.EmployeeID = Lunch.EmployeeID
group by t.EmployeeID
) t2
join Clock on t2.EmployeeID = Clock.EmployeeID
group by t2.EmployeeID

Вы также можете найти способ различать дни недели, используя DAYOFWEEK и [112 ] регистр синтаксиса . Вам нужно будет использовать их и разумно комбинировать их с суммой.

43
задан Lukas Eder 30 May 2014 в 07:29
поделиться

5 ответов

вы можете начать с max (trans_seq_no) + 1.

смотреть:

SQL> create table my_numbers(my_number number not null primary key);

Table created.

SQL> insert into my_numbers(select rownum from user_objects);

260 rows created.

SQL> select max(my_number) from my_numbers;

MAX(MY_NUMBER)
--------------
           260

SQL> create sequence my_number_sn start with 260;

Sequence created.

SQL> insert into my_numbers(my_number) values (my_number_sn.NEXTVAL);
insert into my_numbers(my_number) values (my_number_sn.NEXTVAL)
*
ERROR at line 1:
ORA-00001: unique constraint (NEIL.SYS_C00102439) violated

Когда вы создаете последовательность с номером, вы должны помнить, что первый Если вы выберете последовательность, Oracle вернет начальное значение, которое вы ей присвоили.

SQL> drop sequence my_number_sn;

Sequence dropped.

SQL> create sequence my_number_sn start with 261;

Sequence created.

SQL>  insert into my_numbers(my_number) values (my_number_sn.NEXTVAL);

1 row created.

Если вы пытаетесь сделать «пустую» вещь, я настоятельно советую вам

1 не делать этого, и # 2 не использовать последовательность для этого.

19
ответ дан 26 November 2019 в 22:34
поделиться

Если вы можете использовать PL / SQL, попробуйте (РЕДАКТИРОВАТЬ: включает предложение Нила xlnt начать со следующего более высокого значения):

SELECT 'CREATE SEQUENCE transaction_sequence MINVALUE 0 START WITH '||MAX(trans_seq_no)+1||' INCREMENT BY 1 CACHE 20'
  INTO v_sql
  FROM transaction_log;

EXECUTE IMMEDIATE v_sql;

Еще один момент, который следует учитывать: установив для параметра CACHE значение 20, вы рискуете потерять до 19 значений в вашей последовательности, если база данных выйдет из строя. Значения CACHEd теряются при перезапуске базы данных. Если вы не выполняете последовательность слишком часто или вас не волнуют пропуски, я бы установил ее равной 1.

И последнее замечание: значения, которые вы указали для CACHE и INCREMENT BY, являются значениями по умолчанию. Вы можете оставить их и получить тот же результат.

36
ответ дан 26 November 2019 в 22:34
поделиться

Вы не можете использовать подвыбор внутри оператора CREATE SEQUENCE . Вам нужно будет заранее выбрать значение.

16
ответ дан 26 November 2019 в 22:34
поделиться

Поместите посередине, значение MAX будет максимальным только из зафиксированных значений . Он может вернуть 1234, и вам может потребоваться учесть, что кто-то уже вставил 1235, но не зафиксировал.

12
ответ дан 26 November 2019 в 22:34
поделиться

используйте динамический sql

BEGIN
            DECLARE
            maxId NUMBER;
              BEGIN
              SELECT MAX(id)+1
              INTO maxId
              FROM table_name;          
              execute immediate('CREATE SEQUENCE sequane_name MINVALUE '||maxId||' START WITH '||maxId||' INCREMENT BY 1 NOCACHE NOCYCLE');
              END;
END;
0
ответ дан 26 November 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: