2014-06-26 13 views
7

Ho tabella chiamata temp_table che consistono in righe seguenti:interno unirsi all'interno di un'istruzione di aggiornamento in PostgreSQL

cola colb result 
---------------- 
    p4 s1 0 
    p8 s1 0 
    p9 s1 0 
    p5 f1 0 
    p8 f1 0 

Ora ho bisogno di aggiornare colonna dei risultati con il conteggio (*) di Colb. Per il quale sto provando la seguente query:

update tem_table 
set result = x.result 
from tem_table tt 
inner join(select colb,count(*) as result from tem_table group by colb) x 
on x.colb = tt.colb; 

e selezionando Colb distinto e derivare da temp_table:

select distinct colb,result from tem_table; 

uscita Ottenere:

colb result 
----------- 
s1 3 
f1 3 

Ma il risultato atteso è:

colb result 
----------- 
s1 3 
f1 2 

I am n nella mia ricerca, dove mi sto sbagliando? Please help me.Thanks

risposta

24

Non si dovrebbe ripetere la tabella da aggiornare nella clausola from. Questo creerà un self join cartesiano.

citazione dal manuale:

Si noti che la tabella di destinazione non deve apparire nel from_list, a meno che non si intende un self-join (nel qual caso deve apparire con un alias in from_list)

(enfasi mia)

Purtroppo UPDATE non supporta i join espliciti utilizzando la parola chiave JOIN. Qualcosa del genere dovrebbe funzionare:

update tem_table 
    set result = x.result 
from (
    select colb,count(*) as result 
    from tem_table 
    group by colb 
) x 
where x.colb = tem_table.colb; 
+0

Grande! Grazie mille. – Meem

Problemi correlati