2011-11-22 23 views
5

Tôi đang sử dụng 10g và đang cố thực hiện một số phép tính đơn giản và sau đó lưu kết quả vào cột. Các bảng thực tế có nhiều cột hơn, nhưng dưới đây là những gì tôi đang sử dụng trong truy vấn của mình:(Còn cách khác) "Thiếu dấu ngoặc đơn phải"

CREATE TABLE "VACCINE_LOT" 
(
    "VACCINE_LOT_ID" NUMBER(10,0) NOT NULL ENABLE, 
    "DOSE"    NUMBER(6,3), 
    "QUANTITY_ON_HAND" NUMBER(12,2) NOT NULL ENABLE 
) 
CREATE TABLE "IMMUNIZATION" 
(
    "VACCINE_LOT_ID" NUMBER(10,0), 
    "DOSE_MAGNITUDE" NUMBER(4,2) 
) 
CREATE TABLE "VACCINE_LOT_TRANSACTION" 
(
    "VACCINE_LOT_ID" NUMBER(10,0) NOT NULL ENABLE, 
    "QUANTITY"  NUMBER(12,2) NOT NULL ENABLE 
) 
INSERT INTO vaccine_lot VALUES (100, 0.2, 120); 
INSERT INTO immunization VALUES (100, 0.2); 
INSERT INTO immunization VALUES (100, 0.3); 
INSERT INTO vaccine_lot_transaction VALUES (100, 150); 

Ảnh chủng ngừa được lấy từ lô vaccin. 'Dose_magnitude' là liều tiêm chủng đặc biệt sử dụng rất nhiều. Cột 'Liều' trong vaccin_lot cho biết cần sử dụng bao nhiêu cho tiêm chủng ngừa tiêu chuẩn. Vì vậy, một shot tiêu chuẩn có thể là 0.1cc. Nhưng một tiêm chủng ngừa có thể thực sự sử dụng 0.2cc hoặc thậm chí 0.05cc. Cột 'Số lượng' trong hồ sơ vaccin_lot_transaction ban đầu có bao nhiêu mũi tiêm chủng ngừa tiêu chuẩn mà lô vaccin chứa đựng.

Những gì tôi đang cố gắng làm ở đây là tính toán chính xác 'Số lượng_hand_hand' cho lô vaccin (có nghĩa là, còn bao nhiêu mũi chích ngừa tiêu chuẩn còn lại cho lô vaccin).

Dưới đây là ví dụ sử dụng dữ liệu chúng tôi vừa chèn vào. Chúng tôi có một lô vaccin (ID lô là '100'), và nó bắt đầu với 150 mũi chích ngừa tiêu chuẩn (có nghĩa là, nó chứa 150 bức ảnh 0.2cc). Có hai mũi chích ngừa tiêm chủng từ lô này, một liều 0.2cc, 0.3cc khác). Và số lượng hiện tại là 120 rõ ràng là sai, và chúng ta cần phải tính toán lại và cập nhật nó.

Đây là câu hỏi của tôi:

UPDATE vaccine_lot V SET quantity_on_hand = 
(
(
    (SELECT T.quantity * V.dose FROM vaccine_lot_transaction T WHERE V.vaccine_lot_id = T.vaccine_lot_id) - 
    (SELECT SUM(I.dose_magnitude) FROM immunization I WHERE I.vaccine_lot_id = V.vaccine_lot_id) 
)/dose 
); 

Và chắc chắn đủ, Oracle bắt đầu phàn nàn về "ngoặc đúng mất tích". Có vẻ như nó nghĩ có cái gì đó sai về mặt cú pháp.

Có ai có thể xem xét truy vấn này và xem có vấn đề gì không? Cảm ơn!

Đây là những gì tôi nhận được khi tôi chạy nó thông qua SQL * PLUS:

SQL> run 
    1 UPDATE vaccine_lot V SET quantity_on_hand = 
    2 (
    3 (
    4  (SELECT T.quantity * V.dose FROM vaccine_lot_transaction T 
    5  WHERE V.vaccine_lot_id = T.vaccine_lot_id) - 
    6  (SELECT SUM(I.dose_magnitude) FROM immunization I 
    7  WHERE I.vaccine_lot_id = V.vaccine_lot_id) 
    8 )/dose 
    9*); 
     WHERE V.vaccine_lot_id = T.vaccine_lot_id) - 
               * 
ERROR at line 5: 
ORA-00907: missing right parenthesis 


Bằng cách này, tôi đang sử dụng phiên bản 10.2.0.1.0 của SQL * Plus. Tôi nhận được kết quả tương tự khi sử dụng SQL Developer (phiên bản 3.0.04).

Có ai có thể xem xét vấn đề này không? Cảm ơn!

+3

Cảm ơn bạn rất nhiều vì đã đăng các định nghĩa bảng và dữ liệu mẫu! Nó cũng sẽ hữu ích để tuyên bố rõ ràng kết quả mong đợi của câu lệnh 'UPDATE' của bạn là gì. Tôi nghĩ rằng một 'QUANTITY_ON_HAND' của 147,5 là chính xác nhưng bạn rõ ràng biết rõ hơn tôi những gì bạn muốn kết quả được. –

+0

Trong phần cắt và dán của bạn từ SQL * Plus, có vẻ như một cái gì đó đang bị cắt. Khi bạn đăng truy vấn của bạn ban đầu (và khi tôi chạy nó) có thêm 't_id) -' trên dòng 4. Nếu điều đó không thực sự ở đó, bạn sẽ nhận được một dấu ngoặc đơn thiếu. –

+0

Đó là vấn đề hiển thị tôi tin. Tôi đã định dạng lại truy vấn để không có gì bị cắt bỏ (vui lòng xem bài đăng gốc của tôi, đã được cập nhật) và tôi vẫn kết thúc với cùng một kết quả. – Hua

Trả lời

2

Tôi đã cắt và dán mã của bạn và mã này có vẻ phù hợp với tôi (tôi tin rằng kết quả cuối cùng là 147,5 là chính xác). Bạn có chắc chắn rằng bạn không vô tình đơn giản hóa vấn đề quá xa?

SQL> CREATE TABLE "VACCINE_LOT" 
    2 (
    3 "VACCINE_LOT_ID" NUMBER(10,0) NOT NULL ENABLE, 
    4 "DOSE"    NUMBER(6,3), 
    5 "QUANTITY_ON_HAND" NUMBER(12,2) NOT NULL ENABLE 
    6 ); 

Table created. 

SQL> CREATE TABLE "IMMUNIZATION" 
    2 (
    3 "VACCINE_LOT_ID" NUMBER(10,0), 
    4 "DOSE_MAGNITUDE" NUMBER(4,2) 
    5 ); 

Table created. 

SQL> CREATE TABLE "VACCINE_LOT_TRANSACTION" 
    2 (
    3 "VACCINE_LOT_ID" NUMBER(10,0) NOT NULL ENABLE, 
    4 "QUANTITY"  NUMBER(12,2) NOT NULL ENABLE 
    5 ); 

Table created. 

SQL> INSERT INTO vaccine_lot VALUES (100, 0.2, 120); 

1 row created. 

SQL> INSERT INTO immunization VALUES (100, 0.2); 

1 row created. 

SQL> INSERT INTO immunization VALUES (100, 0.3); 

1 row created. 

SQL> INSERT INTO vaccine_lot_transaction VALUES (100, 150); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> UPDATE vaccine_lot V SET quantity_on_hand = 
    2 (
    3 (
    4  (SELECT T.quantity * V.dose FROM vaccine_lot_transaction T WHERE V.vacci 
ne_lot_id = T.vaccine_lot_id) - 
    5  (SELECT SUM(I.dose_magnitude) FROM immunization I WHERE I.vaccine_lot_id 
= V.vaccine_lot_id) 
    6 )/dose 
    7 ); 

1 row updated. 

SQL> select * from vaccine_lot; 

VACCINE_LOT_ID  DOSE QUANTITY_ON_HAND 
-------------- ---------- ---------------- 
      100   .2   147.5 
+0

Cảm ơn bạn đã trả lời Justin.
Điều này thực sự cản trở tôi vì tôi đang sử dụng 10g, và nó giữ cho tôi cùng một lỗi trên cả SQL Developer và SQL cộng ... – Hua

+0

@ user1060340 - Bạn có thể thực hiện cắt và dán từ SQL * Plus giống như tôi đã làm cho thấy lỗi bạn đang gặp phải? Bạn có đang sử dụng phiên bản SQL * Plus hợp lý gần đây không? Hay bạn đang sử dụng phiên bản cũ hơn của SQL * Plus để truy cập cơ sở dữ liệu 10g? –

+0

SQL> chạy 1 CẬP NHẬT vaccine_lot V SET quantity_on_hand = 2 ( 3 ( 4 (CHỌN T.quantity * V.dose TỪ vaccine_lot_transaction T ĐÂU V.vaccine_lot_id = T.vaccine_lo 5 (SELECT SUM (I.dose_magnitude) TỪ tiêm chủng tôi ĐÂU I.vaccine_lot_id = V.vaccine_lot_id) 6)/liều 7 *); (SELECT T.quantity * V.dose TỪ vaccine_lot_transaction T ĐÂU V.vaccine_lot_id = T.vaccine_lot LỖI tại dòng 4: ORA-00907: thiếu dấu ngoặc đơn phải
Nhân tiện, tôi đang sử dụng phiên bản 10.2.0.1.0 của SQL * Plus. Tôi nhận được kết quả tương tự khi sử dụng SQL Devel hoạt động (phiên bản 3.0.04). Cảm ơn một lần nữa! – Hua

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