我正在使用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);
Run Code Online (Sandbox Code Playgroud)
免疫注射取自疫苗批次.'Dose_magnitude'是一个特定的免疫注射使用了多少.vaccine_lot中的'Dose'列显示了标准免疫注射的使用量.所以标准镜头可能是0.1cc.但是一次免疫射击实际上可能使用0.2cc甚至0.05cc.vaccine_lot_transaction中的"数量"列最初记录疫苗批次包含的标准免疫注射数量.
我在这里要做的是为疫苗批次计算正确的'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
);
Run Code Online (Sandbox Code Playgroud)
果然,甲骨文开始抱怨"错过正确的括号".看起来它认为语法错误.
任何人都可以帮助看看这个查询,看看它有什么问题吗?谢谢!
这是我通过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
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我使用的是SQL*Plus版本10.2.0.1.0.使用SQL Developer(版本3.0.04)时,我得到相同的结果.
任何人都可以帮忙看一下这个问题吗?谢谢!
我剪切并粘贴了你的代码,它似乎对我有用(我相信 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1202 次 |
最近记录: |