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かもしれません。しかし、1 回の予防接種で実際に使用される量は 0.2cc または 0.05cc です。vaccine_lot_transaction の「Quantity」列には、元々、ワクチン ロットに含まれる標準予防接種のショット数が記録されています。

私がここでやろうとしているのは、ワクチン ロットの正しい '手元の数量' (つまり、ワクチン ロットにまだ残っている標準的な予防接種の注射の数) を計算することです。

挿入したデータを使用した例を次に示します。ワクチン ロット (ロット ID は「100」) があり、150 の標準ショット (つまり、150 の 0.2cc ショットが含まれています) から始まります。このロットからすでに 2 回の予防接種が行われています (1 回は 0.2cc、もう 1 回は 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*Plus のバージョン 10.2.0.1.0 を使用しています。SQL Developer (バージョン 3.0.04) を使用しても同じ結果が得られます。

誰でもこの問題を調べるのを手伝ってもらえますか? ありがとう!

4

1 に答える 1

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
于 2011-11-22T19:23:46.450 に答える