2012-07-11 11 views
9

Tengo una tabla con la estructura dada, ahora quiero escribir una consulta que transfiera 2 productos xx del estado 1 para decir el estado 2. El código secundario es irrelevante actualmente para mí.limitando el comando de actualización de 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 

he implementado controles básicos, y cuando se utiliza

update only product_child 
set product_status=1 
where product_status=2 

las tres de xx obtuve el código 2, quiero el control sobre eso, yo estaba esperando una sola xx obtendrá cambio de código con este comando

+1

Solo uno ... * which * one? – wildplasser

+0

@wildplasser quería que cualquiera xx para cambiar el estado del código hijo no están en mi consideración en este momento – Mohit

+0

* cualquiera *: simplemente elegido al azar, pero solo * exactamente * uno? – wildplasser

Respuesta

16

Si no le importa qué fila se actualiza a, algo que sería muy cuidadoso de hacer (por favor, añadir un PK a la mesa para que esto realmente), entonces se podría usar algo como lo siguiente:

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 es un identificador de fila único, y al limitar la subselección a 1 registro obtenemos un CTID correspondiente a una fila que cumple con la cláusula WHERE.

+0

bien en la implementación actual cualquier hijo aleatorio de un maestro específico hará. master_code es un FK para tratar con niños específicos, tengo una lógica separada – Mohit

+0

Sí, creo que debería tener alguna lógica para seleccionar una específica, incluso algo tan simple como el registro más antiguo le daría algo con qué trabajar. Esto hará retroceder a un niño al azar como lo solicitó. –

+0

su código de error está dando 'ERROR: error de sintaxis en o cerca " donde" Línea 3: DONDE CTID IN (SELECT CTID más que si product_status = ... ^ ********** Error ********** ERROR: error de sintaxis en o cerca de "DONDE" Estado de SQL: 42601' – Mohit

3

he encontrado una manera

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 palabra clave 'only' solo es necesaria si se trata de tablas heredadas.No hace nada en una tabla "regular". –

4

tal vez debería hacer esto con un procedimiento:

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; 

luego llamar con:

select * from update_status() 

EDIT: también se puede hacer esto 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 ; 

Saludos

Cuestiones relacionadas