2010-09-23 16 views
5

voglio raggiungere i seguenti obiettivi:Aggiornamento tabella con un "Select query" con una clausola WHERE

Stato attuale della tabella (my_table)

id  totalX   totalY   totalZ    
--------- -------------- -------------- --------------  
     9    34    334    0  
     10    6    56    0  
     11    21    251    0  
     12    3    93    0 

risultato Query di (my_table2)

select id,count(*) as total FROM my_table2 WHERE column_2 = 1 GROUP BY id 

id  total    
--------- --------------  
     9   500  
     10   600  
     11   700  
     12   800 

stato previsto di tabella (my_table)

id  totalX   totalY   totalZ    
--------- -------------- -------------- --------------  
     9    34    334    500  
     10    6    56    600  
     11    21    251    700  
     12    3    93    800  

Questo può essere fatto in una query di aggiornamento? Sto cercando per Sybase ASE 12.5 su una RHEL 5.0

EDIT: Ho coudn't trovare la soluzione per Sybase, ma la risposta corrente alla domanda funziona su MS SQL Server ..

+0

C'è qualche campo che unisce my_table e my_table2? Sembra che il campo di adesione sia arbitrario. – JNK

+0

Il campo di unione è "id". Il problema è che la query di my_table2 richiede un gruppo per. – Stewie

+0

NVM, ho letto male la seconda query. – JNK

risposta

9
update 
      my_table 
    set 
     my_table.totalZ = t.total 
    FROM 
    my_table mt 
    INNER JOIN 
     (select id,count(*) as total 
     FROM my_table2 
     WHERE column_2 = 1 GROUP BY id) t 
    on mt.id = t.id 

UPDATE In MS SQL Server questo è ciò che si farebbe. L'OP ha notato che questo non funziona in Sybase.

+0

Questo produce errore: messaggio 11762, livello 15, stato 1: server 'DEVDB1', riga 1: Non è possibile utilizzare una tabella derivata nella clausola FROM di un'istruzione UPDATE o DELETE – Stewie

+0

@Stewie Ci scusiamo. Avrei dovuto includere nella mia risposta che non avevo controllato Sybase ma funziona in MS SQL Server. –

+0

Ecco cosa ho indovinato. Dovrebbe funzionare anche con MySQL. Suppongo che Sybase sia solo un Bi ** h – Stewie

2

qualcosa come questo dovrebbe fare il trucco

update my_table 
set my_table.totalZ = (select count(*) from my_table2 where my_table.id = my_table2.id and my_table2.column_2 = 1); 
+0

Ho pensato che non avrebbe funzionato, ma così è stato. Un ritardo molto tardi. – Hambone

Problemi correlati