2012-07-11 9 views
9

Ho una tabella con struttura data, ora voglio scrivere una query che trasferirà 2 prodotti xx dallo stato 1 per dire lo stato 2. il codice figlio è attualmente irrilevante per me.limitando il comando di aggiornamento di postgreSQL

master_code| child_code | status_code 
-----------|------------|------------ 
    xx  | xx1  |  1 
    xx  | xx2  |  1 
    xx  | xx3  |  1 
    xx  | xx4  |  2 
    xx  | xx5  |  2 
    yy  | yy1  |  3 
    yy  | yy2  |  2 
    zz  | zz1  |  1 
    zz  | zz2  |  1 

ho implementato controlli di base, e quando ho usato

update only product_child 
set product_status=1 
where product_status=2 

tutti e tre i xx Got codice 2, voglio il controllo su questo, mi aspettavo solo un xx otterrà modifica del codice con questo comando

+1

Solo uno ... * quale * uno? – wildplasser

+0

@wildplasser volevo che uno xx cambiasse lo stato Il codice figlio non è nella mia considerazione adesso – Mohit

+0

* uno *: scelto a caso, ma solo * esattamente * uno? – wildplasser

risposta

16

Se non vi interessa quale riga viene aggiornato, qualcosa sarei molto prudente di fare (si prega di aggiungere un PK al tavolo per davvero), allora si potrebbe usare qualcosa come il seguente:

UPDATE 
    product_child 
SET 
    product_status = 1 
WHERE 
    CTID IN (SELECT CTID FROM product_child WHERE product_status = 2 and master_code = 'xx' LIMIT 1) 

CTID è un identificatore di riga univoco e limitando la sottoselezione a 1 record si ottiene un CTID corrispondente a una riga che soddisfa la clausola WHERE.

+0

bene nell'implementazione corrente qualsiasi figlio casuale di un master specifico farà. master_code è un FK per trattare un bambino specifico ho una logica separata – Mohit

+0

Sì, credo che dovresti avere un po 'di logica che ne individua uno specifico - anche qualcosa di semplice come il record più vecchio ti darebbe qualcosa su cui lavorare. Questo ritirerà un bambino a caso come richiesto. –

+0

il codice sta dando errore 'Errore: errore di sintassi nei pressi o "WHERE" LINEA 3: DOVE CTID IN (SELECT CTID FROM WHERE solo product_status = ... ^ ********** Errore ********** ERRORE: errore di sintassi in corrispondenza di "WHERE" SQL: 42601' – Mohit

3

ho trovato un modo

update only product_child 
set product_status =1 
where product_child_code in (select product_child_code 
       from product_child 
       where product_code = get_product_code('Baby Crib') 
       and product_status = 2 
       limit 5) 
+3

La parola chiave 'only' è richiesta solo se si ha a che fare con tabelle ereditate.Non fa nulla su una tabella "normale". –

4

Forse si dovrebbe fare questo con una procedura:

CREATE or replace FUNCTION update_status() returns character varying as $$ 
declare 
match_ret record; 
begin 
SELECT * INTO match_ret FROM product_child WHERE product_status = 2 LIMIT 1 for update ; 
UPDATE product_child SET status_code = '1' where child_code = match_ret.child_code ; 

return match_ret.child_code ; 
commit; 
end ; 
$$ LANGUAGE plpgsql; 

quindi chiamare con:

select * from update_status() 

EDIT: si può anche fare questo con un 'con':

WITH subRequest as (
SELECT child_code FROM product_child WHERE status = 2 LIMIT 1 FOR UPDATE 
) 
UPDATE product_child as p 
FROM subRequest 
WHERE p.child_code = subRequest.child_code ; 

Saluti

Problemi correlati