2012-12-12 40 views
6

Tôi nhận được ORA-00947: not enough values từ truy vấn dưới đây:Oracle - SQL - chèn vào với phụ chọn

insert into tableb 
(colA, colb, colc, cold) 
select 
(select max(rec_no)+1 from tableb) 
F2, 
F3, 
F4 
from tablea; 

Ai đó có thể chỉ cho tôi cách chính xác để bao gồm một truy vấn phụ cho một INSER vào/lựa chọn công bố?

Cảm ơn

+5

tôi hy vọng bạn không cố gắng tạo một ID duy nhất bằng cách sử dụng 'max()' approache đó. Bởi vì nó sẽ không hoạt động. Sử dụng tốt hơn một chuỗi –

+0

@a_horse_with_no_name thực sự đây là những gì tôi đã cố gắng. Bạn có thể cung cấp một liên kết đến một cuộc thảo luận về cách tôi đạt được điều này với một chuỗi không? Cảm ơn –

+1

Xem câu trả lời của tôi. Trình tự vẫn không giải quyết được vấn đề phải làm nếu tablea trống (như David Aldridge đã đề cập) –

Trả lời

13

Bạn chỉ thiếu dấu phẩy. Vì vậy, Oracle nghĩ rằng F2 là tên của lựa chọn phụ của bạn.

insert into tableb 
(colA, colb, colc, cold) 
select 
(select max(rec_no)+1 from tableb) , -- comma here 
F2, 
F3, 
F4 
from tablea; 
+1

Cảm ơn bạn! Tôi đã phát điên! –

+1

Sẽ không hoạt động nếu không có hàng trong bảng bắt đầu hoặc nhiều phiên đang chạy mã đó cùng một lúc. Thật không may là cách tiếp cận cơ bản là thiếu sót. –

+0

@David Aldridge các bảng không trống, tôi là người duy nhất chạy mã này. Có phương pháp nào tốt hơn không? –

6

Cách duy nhất đáng tin cậy, nhanh chóng và có thể mở rộng để tạo ID duy nhất là sử dụng trình tự.

Lý do giải pháp "max()" không hoạt động, là giao dịch sẽ không thấy các thay đổi không được cam kết từ giao dịch khác. Vì vậy, hai giao dịch đồng thời có thể kết thúc bằng cách sử dụng cùng một giá trị cho max() do đó sẽ tạo ra các giá trị id trùng lặp.

Để tạo các giá trị từ một chuỗi trong trường hợp của bạn, bạn rõ ràng là cần phải đầu tiên tạo ra một chuỗi:

create sequence seq_b; 

Sau đó sử dụng chuỗi trong câu lệnh select của bạn:

insert into tableb 
    (colA, colb, colc, cold) 
select seq_b.nextval, 
     F2, 
     F3, 
     F4 
from tablea; 
+0

Cảm ơn bạn đã khám phá và trợ giúp. –

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