2012-07-11 40 views
9

Tôi có bảng có cấu trúc nhất định, bây giờ tôi muốn viết truy vấn sẽ chuyển 2 xx sản phẩm từ trạng thái 1 sang trạng thái 2. mã con hiện không liên quan đến tôi.giới hạn lệnh cập nhật 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 

tôi đã thực hiện kiểm tra cơ bản, và khi tôi sử dụng

update only product_child 
set product_status=1 
where product_status=2 

cả ba của xx bị mã số 2, tôi muốn kiểm soát đó, tôi đã mong chỉ có một xx sẽ nhận được sự thay đổi mã với lệnh này

+1

Chỉ một ... * mà * một? – wildplasser

+0

@ wildplasser tôi muốn bất kỳ một xx để thay đổi mã con trạng thái không phải là trong xem xét của tôi ngay bây giờ – Mohit

+0

* bất kỳ một *: chỉ ngẫu nhiên lựa chọn, nhưng chỉ * chính xác * một? – wildplasser

Trả lời

16

Nếu bạn không quan tâm mà hàng được cập nhật, một cái gì đó tôi sẽ rất thận trọng khi làm (xin thêm một PK để bàn cho thực sự này), sau đó bạn có thể sử dụng giống như sau:

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 là một định danh hàng duy nhất - và bằng cách giới hạn chọn lựa thành 1 bản ghi, chúng tôi lấy lại một CTID tương ứng với hàng đáp ứng mệnh đề WHERE.

+0

cũng trong thực hiện hiện tại bất kỳ đứa trẻ ngẫu nhiên của một bậc thầy cụ thể sẽ làm. master_code là một FK để xử lý với một đứa trẻ cụ thể, tôi có một logic riêng biệt – Mohit

+0

Vâng tôi tin rằng bạn nên có một số logic chọn ra một cái cụ thể - thậm chí một cái gì đó đơn giản như bản ghi cũ nhất sẽ cung cấp cho bạn một cái gì đó để làm việc. Điều này sẽ kéo lại một đứa trẻ ngẫu nhiên như bạn yêu cầu. –

+0

mã của bạn đang đưa ra lỗi 'L ERI: lỗi cú pháp tại hoặc gần" WHERE " LINE 3: WHERE CTID IN (SELECT CTID FROM WHERE product_status = ... ^ ********** Lỗi ********** LRI: lỗi cú pháp tại hoặc gần "WHERE" Trạng thái SQL: 42601' – Mohit

3

tôi tìm thấy một cách

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

Từ khóa 'only' chỉ được yêu cầu nếu bạn đang xử lý các bảng được kế thừa.Nó không có gì trên một bảng "thường xuyên". –

4

Có lẽ bạn nên làm điều này với một thủ tục:

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; 

sau đó gọi nó với:

select * from update_status() 

EDIT: bạn cũng có thể làm điều này với 'có':

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 ; 

Kính trọng

Các vấn đề liên quan