2015-07-30 9 views
5

W aplikacji zamierzam skracać i wstawiać do bazy danych Oracle 12c, ale znalazłem ten problem w kolumnie IDENTITY. Mimo że instrukcja INSERT... SELECT działa na większości użytych przeze mnie SELECT zastosowań, które próbowałem, gdy ta instrukcja ma również klauzulę GROUP BY, to nie działa, wydając "skargę ORA-00979: nie jest to wyrażenie o adresie GROUP BY". Poniżej znajduje się przykładowy kod:Oracle SQL: W jaki sposób wstawić instrukcję SELECT z klauzulą ​​GROUP BY do tabeli z kolumną 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; 

Działa na pierwszej wstawce, ale kończy się niepowodzeniem.

EDYCJA: Zmieniono kod, więc kwestia jest łatwiejsza do zrozumienia, a jednocześnie możliwa do odtworzenia.

Doceń pomoc!

+0

Czy to działa, jeśli użyjesz 'wybierz * z (wybierz" Scott "z podwójnej grupy przez 1)'? – GolezTrol

+0

Kolumny tożsamości są podobne do sekwencji i są w każdym razie odrębne. Jaki jest wymóg biznesowy dotyczący grupowania w kolumnach tożsamości? – vishad

+1

Próbowałem już tej enkapsulacji wybierz, ale problem pozostaje. @vishad Chcę grupować w innych kolumnach, a nie w tożsamości, aby mieć pojedynczy wpis dla innych kolumn, a następnie przekazać ten wpis do nowej tabeli wraz z tożsamością. –

Odpowiedz

4

W społeczności Oracle odpowiedź na to pytanie została wyjaśniona. 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 

Cytowanie oryginalną odpowiedź, należy pamiętać, że wskazówka Materialise nie jest udokumentowana. Dziękuję wszystkim za pomoc!

+0

wow, to się stało. dzięki! –