2012-07-11 23 views
9

Mam tabelę o podanej strukturze, teraz chcę napisać zapytanie, które przeniesie 2 xx produkt ze stanu 1, aby powiedzieć status 2. kod podrzędny jest obecnie dla mnie bez znaczenia.ograniczenie polecenia aktualizacji 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 

I wprowadziły podstawowe kontrole, a kiedy używany

update only product_child 
set product_status=1 
where product_status=2 

wszystkie trzy xx ma kod 2, chcę kontrola nad tym, spodziewałem się tylko jeden xx dostanie zmianę kodu z tym poleceniem

+1

Tylko jeden ... * który * jeden? – wildplasser

+0

@wildplasser Chciałem, aby każdy xx zmienił status kodu podrzędnego, nie jest w tej chwili rozważany. – Mohit

+0

* dowolny *: tylko losowo wybrany, ale tylko * dokładnie * jeden? – wildplasser

Odpowiedz

16

Jeśli nie obchodzi, który wiersz jest aktualizowany, coś Byłbym bardzo ostrożny sposób (proszę dodać PK do stołu za to naprawdę), a następnie można użyć coś jak poniżej:

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 jest niepowtarzalnym identyfikatorem wiersza - i ograniczając podselekt do 1 rekordu, otrzymujemy jeden CTID odpowiadający wierszowi, który spełnia klauzulę WHERE.

+0

również w obecnej implementacji zrobi dowolne losowe dziecko określonego mistrza. master_code to FK do czynienia z konkretnym dzieckiem Mam osobną logikę – Mohit

+0

Tak, wierzę, że powinieneś mieć jakąś logikę, wybierając konkretną - nawet coś tak prostego jak najstarszy zapis dałoby ci coś do pracy. Spowoduje to wycofanie losowego dziecka, o które prosiłeś. –

+0

kod daje błąd 'BŁĄD: błąd składni na lub w pobliżu " gdzie" LINE 3: gdzie CTID IN (SELECT CTID, wyłącznie jeśli product_status = ... ^ ********** Błąd ********** BŁĄD: błąd składniowy w lub w pobliżu "WHERE" Stan SQL: 42601' – Mohit

3

znalazłem sposób

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

Słowo kluczowe "only" jest wymagane tylko w przypadku dziedziczonych tabel.Nie robi nic na "zwykłym" stole. –

4

Może powinieneś zrobić z procedurą:

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; 

następnie połączyć go z:

select * from update_status() 

EDIT: można również zrobić to z "z":

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 ; 

Pozdrawiam

Powiązane problemy