我正在使用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中的“剂量”列说明了标准免疫接种的使用量。所以一个标准的射程可能是0.1cc。但一针免疫实际上可能使用0.2cc,甚至0.05cc。vaccine_lot_transaction中的“Quantity”列最初记录了一批疫苗包含多少次标准免疫接种。
我在这里尝试做的是计算疫苗批次的正确'Quantity_on_hand‘(即,还剩下多少标准免疫接种给疫苗批次)。
下面是一个使用我们刚刚插入的数据的示例。我们有一个疫苗批次(批次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
);果然,Oracle开始抱怨“缺少右括号”。看起来它认为在语法上有问题。
有没有人可以帮我看一下这个查询,看看它有什么问题?谢谢!
这是我通过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*Plus的10.2.0.1.0版。在使用SQL Developer (版本3.0.04)时,我得到了相同的结果。
有没有人能帮我看看这个问题?谢谢!
发布于 2011-11-23 03:23:46
我剪切并粘贴了您的代码,它似乎对我有效(我相信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.5https://stackoverflow.com/questions/8232486
复制相似问题