2010-06-22 38 views
13

Xin lưu ý: Tôi am đặt câu hỏi tôi muốn được trả lời. Tôi biết câu hỏi này có nghĩa là cơ sở dữ liệu được thiết lập kém. Vì vậy, tôi sẽ bỏ phiếu xuống bất kỳ câu trả lời nào đề xuất thay đổi cách thức thiết lập bảng.Oracle: sao chép hàng trong khi cập nhật một trường

Tôi cần sao chép một loạt hàng, trong khi thay đổi một giá trị.

name col1 col2 
dave a nil 
sue b nil 
sam c 5 

cần phải trở thành:

name col1 col2 
dave a nil 
dave a a 
sue b nil 
sue b a 
same c 5 

IE cho tất cả các mục trong bảng này, nơi col2 is null, tạo một mục mới trong bảng nơi namecol1 là sao chép, và col2a.

+0

Bạn có nghĩa là 'NULL' khi bạn thỉnh thoảng nói' nil'? – tvCa

Trả lời

17

Sử dụng:

INSERT INTO table 
    (name, col1, col2) 
SELECT t.name, t.col1, 'a' 
    FROM TABLE t 
WHERE t.col2 IS NULL 

Đó là giả định không phải các name hoặc col1 cột là một khóa chính hoặc có một hạn chế duy nhất trên một trong hai.

+0

Nhận xét trước đã bị xóa: Tôi đã tìm thấy lỗi của mình. Vâng, điều này đã làm việc. Cảm ơn! –

+3

Mã này yêu cầu lặp lại danh sách các cột trong bảng và sẽ phá vỡ nếu cột được thêm vào bảng. Có cách nào để làm điều đó mà không liệt kê các cột không quan tâm? –

+0

@kevincline Xem http://stackoverflow.com/a/28278824/1611055 –

3

Điều này có thực hiện được không?

INSERT INTO yourtable 
     (SELECT name, col1, 'a' 
      FROM yourtable 
     WHERE col2 is NULL); 
+0

+1 câu trả lời hay, mặc dù nó không thực sự hoạt động trong trường hợp của tôi. Tôi chỉ điền một số trường trong bảng. –

+0

Nên, nhưng rủi ro một lỗi ORA nếu có nhiều cột trong bảng. –

+0

Yup, giả định là bảng có các cột trong ví dụ. – DCookie

0

Nếu số cột là lớn, bạn có thể sao chép dữ liệu bạn muốn vào một bảng tạm thời, làm thay đổi dữ liệu trong bảng tạm thời như bạn muốn, sau đó sao chép các nội dung của bảng tạm thời trở lại bản gốc và xóa bảng tạm thời.

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