2012-06-06 10 views
5

Ho una dichiarazione di aggiornamento mostrata di seguito che funziona bene, ho usato un'istruzione with nella sottoquery per migliorare notevolmente le prestazioni, ma per qualche motivo non sono autorizzato ad aggiungere una colonna aggiuntiva dalla stessa tabella per l'aggiornamento.Perché non posso aggiornare più di una colonna allo stesso tempo usando Con parola chiave?

Works:

UPDATE Table_A SET (Col_One) = (WITH OneValue AS (SELECT DISTINCT t.Col_One 
                FROM Table_Two t, Table_A a 
                WHERE t.id = a.New_Id)) 
           SELECT Col_One FROM OneValue); 

Quello che mi piacerebbe fare è solo inserire un'altra colonna di aggiornare anche da table_two come questo

UPDATE Table_A SET (Col_One, Col_Two) = (WITH OneValue AS (SELECT DISTINCT t.Col_One, T.Col_two 
                FROM Table_Two t, Table_A a 
                WHERE t.id = a.New_Id)) 
           SELECT Col_One, Col_Two FROM OneValue); 

ma ottengo ORA-01767 aggiornamento set espressione deve essere una subquery. Capisco questo errore ma non riesco a vedere come lo sto generando. Qualsiasi aiuto è molto apprezzato.

Grazie in anticipo.

+1

Non vedo alcun motivo per cui le prestazioni trarrebbero vantaggio dalla clausola di factoring dei subquery. Controlla i piani di esecuzione per vedere se c'è una differenza. –

+0

Ben nuovo per la codifica, non sono sicuro di poter rispondere correttamente, tranne per dire che stavo avendo problemi con le prestazioni della tabella 2, che è un tavolo molto grande. Mi sono guardato intorno e ho trovato alcune utili informazioni sull'ottimizzazione dell'aggiornamento tramite askTom [link] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::1111_QUESTION_ID:288016031632), applicato alla mia situazione e le prestazioni sono passate da> 5 minuti a <10 secondi. – dee

+0

+1 per guardare a asktom, ma -1 per non seguire la filosofia esposta lì :) Dai un'occhiata a come fa i confronti delle prestazioni. Utilizzare DBMS_Xplan per ottenere piani di esecuzione per le query e cercare le differenze e fare attenzione a una seconda query che beneficia della memorizzazione nella cache dei dati –

risposta

8

Questo sembra funzionare (lo ha fatto con una semplice query utilizzando DUAL comunque):

UPDATE Table_A SET (Col_One, Col_Two) = (select col_one, col_two from 
              (WITH OneValue AS (SELECT DISTINCT t.Col_One, T.Col_two 
                FROM Table_Two t, Table_A a 
                WHERE t.id = a.New_Id)) 
              SELECT Col_One, Col_Two FROM OneValue) 
             ); 

Per quanto riguarda il motivo per cui non funziona se la subquery inizia con "CON", posso solo immaginare che è perché i progettisti di Oracle SQL non avevano previsto questo utilizzo.

+0

Questa soluzione alternativa funziona. Grazie per aver risposto così velocemente. Mi sembra però inutilmente ridondante, ma essendo nuovo a questo non posso fare a meno di chiedermi se ha qualche ragione logica per farlo. – dee

+0

Grazie per l'ottima risposta! Sono stato perplesso da questo stesso problema e iniziando a diventare piuttosto frustrato. Ancora non sono sicuro del perché funzioni, ma almeno lo fa! :) –

Problemi correlati