【发布时间】:2011-11-22 19:18:29
【问题描述】:
我使用的是 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' 是特定免疫注射的用量。疫苗批次中的“剂量”列说明标准免疫注射的用量。所以标准镜头可能是0.1cc。但一次免疫注射实际上可能使用 0.2cc 甚至 0.05cc。疫苗批次交易中的“数量”列最初记录了一个疫苗批次包含多少标准免疫注射。
我在这里尝试做的是计算疫苗批次的正确“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
顺便说一句,我使用的是 10.2.0.1.0 版的 SQL*Plus。使用 SQL Developer(版本 3.0.04)时,我得到了相同的结果。
谁能帮忙看看这个问题?谢谢!
【问题讨论】:
-
非常感谢您发布表定义和示例数据!明确说明
UPDATE语句的预期结果应该是什么也很有用。我认为 147.5 的QUANTITY_ON_HAND是正确的,但您显然比我更清楚您想要的结果是什么。 -
在您从 SQL*Plus 中剪切和粘贴的过程中,似乎有些东西被剪切掉了。当您最初发布查询时(以及当我运行它时),第 4 行有一个额外的
t_id) -。如果实际上不存在,您会收到一个缺少括号的错误。 -
我相信这是显示问题。我重新格式化了查询,以便没有任何内容被截断(请参阅我的原始帖子,已更新),我仍然得到相同的结果。