2015-02-05 9 views
10

Sto provando a scrivere un INSERT INTO che esegue un lavoro DISTINCT/GROUP BY. La query funziona perfettamente come un'istruzione select, ma non funzionerà se è racchiusa in INSERT INTO.La query GROUP BY valida non funziona se combinata con INSERT INTO su Oracle

INSERT INTO MasterRecords 
    (BatchRecordRecordID, SourceID, BatchID) 
SELECT RecordID, SourceID, BatchID 
FROM (
    SELECT RecordID, BatchID, 101 AS SourceID 
    FROM BatchRecords 
    WHERE BatchID = 150 
    GROUP BY RecordID, BatchID 
) BR 

Questo mi fa guadagnare:

SQL Error: ORA-00979: not a GROUP BY expression

Ma se rimuovere solo l'INSERT INTO codice, funziona perfettamente bene:

SELECT RecordID, SourceID, BatchID 
FROM (
    SELECT RecordID, BatchID, 101 AS SourceID 
    FROM BatchRecords 
    WHERE BatchID = 150 
    GROUP BY RecordID, BatchID 
) BR 

Risultati:

3 101 150 
5 101 150 
6 101 150 
2 101 150 
4 101 150 
8 101 150 
7 101 150 
1 101 150 

mio l'assunto è che GROUP BY non è consentito all'interno INSERIRE le istruzioni selezionate ma non riesco a trovare quasi nessuna documentazione a conferma di ciò.

+1

Cosa succede se si esegue la selezione più interna da sola? (la tabella derivata non è realmente necessaria in ogni caso) Ricordo un bug in cui le clausole 'di gruppo by' non valide non erano riconosciute in una tabella derivata o in una sotto-selezione. Non ricordare i dettagli però. Inoltre, (non correlato): '150 AS BatchID' non ha senso se si utilizza' WHERE BatchID = 150' –

+0

Funziona allo stesso modo se non viene reincartato con la selezione esterna. E il BatchID hard codificato è solo dalla mia area di lavoro, quella logica non è critica. –

+0

Se si aggiunge RecordID al gruppo funziona? – xQbert

risposta

0

Mi chiedo se si tratta di un problema di esecuzione dell'ordine ... funziona se si utilizza un CTE? CTE deve prima concretizzarsi in tal modo risolvere il gruppo da ...

Insert INTO MasterRecords (BatchRecordRecordID, SourceID, BatchID) 
    WITH BR AS (
    SELECT RecordID, 101 AS SourceID, 150 AS BatchID 
    FROM BatchRecords 
    GROUP BY RecordID, 101,150) 
    Select RecordID, SourceID, BatchID FROM BR 

o ... il motivo per cui il gruppo da e dove la clausola in primo luogo non sembrano fare nulla in quanto recordID non è un aggregato e non fa parte del gruppo da ...

Inserire nel masterRecords (batchrecordRecordID, sourceid, BatchID) SELEZIONA recordID, 101, 150 da batchRecords

+0

Non ho familiarità con Oracle come con SQL Server, Oracle supporta anche CTE? –

+3

@TomHalladay: ha funzionato * a lungo * prima di SQL Server –

+0

grazie a: http://stackoverflow.com/questions/24008316/insert-into-from-cte ha aggiornato la mia risposta. – xQbert

2

sto pensando sbagliato, ma non è lo sql qui sotto uguale a quello che vuoi ottenere?

INSERT INTO MasterRecords(BatchRecordRecordID, SourceID, BatchID) 
SELECT DISTINCT RecordID, 101, 150 
FROM BatchRecords 
WHERE BatchID = 150 
; 
+0

Sembra funzionare ora anche se ero certo che non funzionasse prima –

0

Il problema viene risolto modificando automaticamente il valore di un parametro (optimizer_features_enable). Questo valore determina la versione di ottimizzazione della base, con 11 non dovrebbe dare quel problema.