2015-07-30 10 views
5

In un'applicazione, ho intenzione di troncare e inserire su un database Oracle 12c, ma ho riscontrato questo problema con una colonna IDENTITY. Anche se l'istruzione INSERT... SELECT funziona sulla maggior parte degli usi di SELECT che ho provato, quando questa istruzione ha anche una clausola GROUP BY, non riesce a funzionare, emettendo un reclamo "espressione ORA-00979: non a GROUP BY". Di seguito è riportato un codice di esempio:Oracle SQL: come INSERIRE un'istruzione SELECT con una clausola GROUP BY su una tabella con colonna IDENTITY?

create table aux (
    owner_name varchar2(20), 
pet varchar2(20)); 

insert into aux values ('Scott', 'dog'); 
insert into aux values ('Mike', 'dog'); 
insert into aux values ('Mike', 'cat'); 
insert into aux values ('John', 'turtle'); 

create table T1 (
    id number generated always as identity, 
    owner_name varchar2(20), 
    pet_count number 
); 
insert into T1 (owner_name, pet_count) 
    select owner_name, count(*) as pet_count from aux group by owner_name; 
select owner_name, count(*) as pet_count from aux group by owner_name; 

Funziona sul primo inserimento, ma non riesce sul successivo.

MODIFICA: ho modificato il codice in modo che il problema sia più facile da comprendere e sia ancora riproducibile.

Apprezzo l'aiuto!

+0

Funziona se si utilizza 'select * from (selezionare 'Scott' dal doppio gruppo di 1)'? – GolezTrol

+0

Le colonne di identità sono come le sequenze e sono comunque distinte, qual è il requisito aziendale per il raggruppamento sulle colonne di identità? – vishad

+1

Ho già provato quella selezione incapsulata, ma il problema rimane. @vishad Voglio raggruppare su altre colonne, non sull'identità, per avere una singola voce per le altre colonne, quindi passare questa voce alla nuova tabella insieme all'identità. –

risposta

4

Nella comunità Oracle, questa domanda ha ricevuto una risposta. https://community.oracle.com/message/13227544#13227544

insert into T1 (owner_name, pet_count) 
with t as (select /*+ materialize */ owner_name, count(*) as pet_count from aux group by owner_name) 
select owner_name, pet_count from t 

Citando la risposta originale, tenere a mente il suggerimento Materialise non è documentato. Grazie a tutti per il vostro aiuto!

+0

wow, l'ha fatto. Grazie! –

Problemi correlati