2011-11-22 3 views
5

나는 10g을 사용하고 간단한 계산을 시도하고 그 결과를 열에 저장하려고합니다. 실제 테이블에 더 많은 열을 가지고 있지만, 여기에 내 쿼리에서 사용하고있는 것을 :(아직 또 다른) "누락 된 오른쪽 괄호"

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); 

예방 접종 샷이 백신 로트에서 가져옵니다. 'Dose_magnitude'는 특정 예방 접종 사가 많이 사용하는 양입니다. vaccine_lot의 'Dose (복용량)'열은 표준 예방 접종 슛을 위해 얼마를 사용해야하는지 알려줍니다. 표준 샷은 0.1cc 일 수 있습니다. 그러나 하나의 예방 주사는 실제로 0.2cc 또는 0.05cc를 사용할 수 있습니다. vaccine_lot_transaction의 'Quantity'열은 원래 백신 로트에 포함 된 표준 예방 접종 주사 횟수를 기록합니다.

여기서 내가하려고하는 것은 백신 로트 (백신 로트에 대해 얼마나 많은 표준 예방 접종 샷이 남아 있는지)에 대해 올바른 'Quantity_on_hand'를 계산하는 것입니다.

방금 ​​삽입 한 데이터를 사용한 예입니다. 우리는 백신 롯트 (lot ID는 '100')를 가지고 있으며 150 개의 표준 샷 (즉, 150 개의 0.2cc 샷을 포함)으로 시작합니다. 이미이 로트에서 두 번의 예방 접종이 있었는데 하나는 0.2cc이고 다른 하나는 0.3cc입니다. 그리고 120의 현재 양은 분명히 잘못되었습니다. 우리는 그것을 다시 계산하고 업데이트해야합니다.

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 
); 

그리고 충분한 확인이 오라클은 "오른쪽 괄호 누락"에 대해 불평하기 시작 :

여기 내 쿼리입니다. 문법적으로 잘못된 것이 있다고 생각하는 것 같습니다.

누구든지이 쿼리를 살펴보고 문제가 무엇인지 확인할 수 있습니까? 감사!

이 내가 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 


, 나는 SQL * 플러스의 버전 10.2.0.1.0을 사용하고 있습니다. SQL Developer (버전 3.0.04)를 사용할 때도 동일한 결과를 얻습니다.

누구든지이 문제를 살펴볼 수 있습니까? 감사!

+3

테이블 정의 및 샘플 데이터를 게시 해 주셔서 감사합니다. 또한 UPDATE 문의 예상 결과가 무엇인지 명시 적으로 기술하는 것이 유용 할 것입니다. 나는 147.5의 QUANTITY_ON_HAND가 맞다고 생각하지만, 분명히 내가 원하는 것보다 더 잘 알고있다. –

+0

SQL * Plus에서 잘라내어 붙여 넣기 할 때, 뭔가 잘리는 것처럼 보입니다. 쿼리를 처음 게시했을 때 (그리고 내가 그것을 실행했을 때) 줄 4에 여분의't_id) -'가있었습니다. 실제로 거기에 없으면 괄호 오류가 누락되었습니다. –

+0

내가 믿는 디스플레이 문제였습니다. 아무것도 잘라내 지 않도록 쿼리의 서식을 다시 지정했습니다 (업데이트 된 내 원래 게시물을 참조하십시오). 그리고 나는 여전히 같은 결과를 얻었습니다. – Hua

답변

2

코드를 잘라내어 붙여 넣기 때문에 효과가있는 것 같습니다 (147.5의 최종 결과가 정확하다고 생각합니다). 실수로 문제를 너무 단순화하지 않았습니까?

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

귀하의 회신 주셔서 감사합니다 저스틴.
10g을 사용하고 있기 때문에 이것은 정말 당황 스럽습니다. SQL Developer와 SQL 모두에서 동일한 오류가 발생합니다 ... – Hua

+0

@ user1060340 - SQL * Plus에서 오려내 기와 붙여 넣기를 할 수 있습니까? 당신이 겪고있는 오류를 보여주는? 합리적으로 최신 버전의 SQL * Plus를 사용하고 있습니까? 아니면 이전 버전의 SQL * Plus를 사용하여 10g 데이터베이스에 액세스하고 있습니까? –

+0

SQL> 실행 1 UPDATE vaccine_lot에 V 세트 quantity_on_hand = 2 (3 ( 4 (vaccine_lot_transaction의 T *로부터 T.quantity V.dose을 선택 WHERE V.vaccine_lot_id가 T.vaccine_lo = 5 ((SUM I.dose_magnitude을 선택) 면역화 FROM WHERE I.vaccine_lot_id I = V.vaccine_lot_id) 6)/도즈 7 *) (vaccine_lot_transaction T WHERE V.vaccine_lot_id = T.vaccine_lot ERROR FROM 라인 (4)에 T.quantity * V.dose 선택 : ORA-00907 : 오른쪽 괄호가 누락되었습니다.
그런데 SQL * Plus의 버전 10.2.0.1.0을 사용하고 있습니다. SQL Devel oper (버전 3.0.04). 다시 한 번 감사드립니다! – Hua

관련 문제