Plsql 插入到表中,第一列为序列

Plsql 插入到表中,第一列为序列,plsql,sequence,nested-queries,Plsql,Sequence,Nested Queries,我正在尝试使用Insert、Sequence和Select*来协同工作 INSERT INTO BRK_INDV Select * from (Select brk_seq.NEXTVAL as INDV_SEQ, a.* FROM (select to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY') BUSINESS_DAY, to_char(REQUEST_DATETIME,'hh24') src_hour, CASE t

我正在尝试使用Insert、Sequence和Select*来协同工作

INSERT INTO BRK_INDV
Select * from (Select brk_seq.NEXTVAL as INDV_SEQ, a.*
FROM (select to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY') BUSINESS_DAY, to_char(REQUEST_DATETIME,'hh24') src_hour, 
CASE tran_type
WHEN 'V' THEN 'Visa'
WHEN 'M' THEN 'MasterCard'
ELSE tran_type
end text,
tran_type, count(*) as count 
from DLY_STATS
where 1=1
AND to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY') = '09-FEB-2015'
group by to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY'),to_char(REQUEST_DATETIME,'hh24'),tran_type order by src_hour)a);  
这给了我以下错误:

ERROR at line 2:
ORA-02287: sequence number not allowed here
我试图通过删除订单,但仍然出现相同的错误

但是,如果我只跑

Select brk_seq.NEXTVAL as INDV_SEQ, a.*
FROM (select to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY') BUSINESS_DAY, to_char(REQUEST_DATETIME,'hh24') src_hour, 
CASE tran_type
WHEN 'V' THEN 'Visa'
WHEN 'M' THEN 'MasterCard'
ELSE tran_type
end text,
tran_type, count(*) as count 
from DLY_STATS
where 1=1
AND to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY') = '09-FEB-2015'
group by to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY'),to_char(REQUEST_DATETIME,'hh24'),tran_type order by src_hour)a;
它显示了正确的条目。那么,为什么select*不适用于此?
请帮忙。

问题是不能在子查询中使用序列。例如,这会产生与您得到的ORA-02287相同的错误:

create table T (x number);

create sequence s;

insert into T (select * from (select s.nextval from dual));
但是,您可以创建一个从序列返回nextval的函数,并在子查询中使用该函数:

create function f return number as
begin
  return s.nextval;
end;
/

insert into T (select * from (select f() from dual));

我明白你想做什么了。您希望按特定顺序将行插入BRK_INDV表。我假设序列号是BRK_INDV的主键,它将按输入行的排序顺序生成

您正在使用关系数据库。关于关系数据库,我们首先了解的特征之一是表中的行顺序无关紧要。那只是fugitaboutit的一个花哨的词

您不能假设select*from表将以写入行的相同顺序返回行。可能吧。可能会持续很长时间。然后一些东西-行的数量,一些列值的分组,月亮的相位-一些东西会改变,你会以一个看起来完全随机的顺序把它们拿出来

如果需要订单,则必须在查询中强制执行,而不是在插入中强制执行

以下是您应该执行的语句:

INSERT INTO BRK_INDV
With
Grouped( Business_Day, Src_Hour, Text, Tran_Type, Count )As(
    Select  Trunc( Request_Datetime ) Business_Day,
            To_Char( Request_Datetime, 'hh24') Src_Hour,
        Case Tran_Type
            When 'V' Then 'Visa'
            When 'M' Then 'MasterCard'
            Else Tran_Type
        end Text,
        Tran_Type, count(*) as count 
    from DLY_STATS
    Where 1=1 --> Generated as dynamic SQL?
        And Request_Datetime >= Date '2015-02-09'
        And Request_Datetime < Date '2015-02-10'
    Group By Trunc( Request_Datetime ), To_Char( Request_Datetime, 'hh24'), Tran_Type
)
Select  brk_seq.Nextval Indv_Seq, G.*
from    Grouped G;
因为在任何一个特定的小时内都可能有成百上千的交易,所以您可能会按小时以外的时间进行订购

在Oracle中,trunc函数是删除时间部分来获取日期的最佳方法。但是,您不希望在where子句中使用它,也不希望在aamof中使用任何其他函数,例如to_date或to_charas,这样会使子句不可搜索并导致完整的表扫描

select * from Brk_Indv order by src_hour;