2013-06-21 42 views
5

Để thực hiện một số thử nghiệm trên một trường bảng mới, tôi muốn giả mạo một số giá trị trên các bản ghi hiện có trong cơ sở dữ liệu thử nghiệm của tôi. Tôi muốn gán một giá trị cho mỗi bản ghi thứ 8 trong một bảng. Tôi có thể dễ dàng chọn từng bản ghi thứ 8 bằng cú pháp này:Oracle SQL cập nhật mỗi hàng thứ n

select * 
from 
    (select rownum rn 
    , jeffs_field_to_update 
    from jeff) 
where mod(rn, 8) = 0; 

Tuy nhiên, tôi khá mới đối với SQL và dường như tôi không thể chuyển đổi điều này thành câu lệnh cập nhật. Tôi thấy rất nhiều câu trả lời ở đây về việc chọn các bản ghi thứ n, nhưng tôi đã có nó. Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Có bảng của bạn có một khóa chính? Thứ tự nào điều chỉnh "mọi bản ghi thứ 8" hoặc không quan tâm đến hàng nào được cập nhật? – APC

+0

Tôi đã kết thúc bằng cách sử dụng câu trả lời của Mikhail, nhưng để trả lời câu hỏi của bạn, tôi đã không thực sự quan tâm đã được cập nhật - Tôi chỉ muốn một tập hợp khá lớn, phân phối trên toàn bảng. – Travis

Trả lời

5

Bạn cần tham gia điều này vào câu lệnh UPDATE trên bất kỳ khóa nào trong bảng. Ví dụ, nếu bạn có một cột id duy nhất, cập nhật tuyên bố sẽ giống như thế này:

update jeff 
set jeffs_field_to_update = value 
where id in 
(select id 
from 
    (select rownum rn 
    , jeff.id 
    from jeff) 
where mod(rn, 8) = 0) 
+0

Cảm ơn bạn! Điều này hoạt động hoàn hảo. – Travis

1

Giả sử bảng của bạn có một id duy nhất để xác định mỗi hàng, bạn có thể làm một cái gì đó như thế này:

update jeff 
    set . . . 
    where id in (select id 
       from (select rownum as rn, id 
         from jeff 
        ) 
       where mod(rn, 8) = 0 
       ) 

bạn cũng sẽ có thể làm điều này với một cái nhìn có thể cập nhật nội tuyến (xem here):

update (select jeffs_field_to_update 
     from (select rownum rn, jeffs_field_to_update 
       from jeff) 
     where mod(rn, 8) = 0 
     ) toupdate 
    set . . . 
1

thậm chí không có chìa khóa, bạn có thể sử dụng rowid trong oracle cho mục đích này.

update mytable 
set mycol = new_value 
where rowid in 
(select rowid from 
    (select rownum rn, id from mytable) 
where mod(rn, 8) = 0) 
+0

Tất cả các loại câu trả lời hay ở đây. Cảm ơn! – Travis

4

Một câu trả lời ngắn:

UPDATE jeff 
SET jeffs_field_to_update = value 
WHERE mod(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID), 8)=0; 
Các vấn đề liên quan