Sto usando 10g e sto cercando di fare un semplice calcolo e quindi salvare il risultato in una colonna. Le tabelle attuali hanno molte più colonne, ma qui sono i quello che sto usando nella mia interrogazione: scatti(Ancora un altro) "Parentesi destra mancante"
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);
di immunizzazione sono presi da un sacco di vaccino. 'Dose_magnitude' è quanto un particolare colpo di vaccinazione utilizza da molto. La colonna "Dose" in vaccine_lot indica quanto usare per un tiro di immunizzazione standard. Quindi un colpo standard può essere 0.1cc. Ma un colpo di vaccinazione può effettivamente usare 0,2 cc o anche 0,05 cc. La colonna "Quantità" in vaccine_lot_transaction registra in origine il numero di vaccinazioni standard che un lotto di vaccino contiene.
Quello che sto cercando di fare qui è quello di calcolare la quantità corretta di "Quantità di mani" per i lotti di vaccini (cioè quanti vaccini standard di immunizzazione sono ancora disponibili per i lotti di vaccino).
Ecco un esempio utilizzando i dati che abbiamo appena inserito. Abbiamo un lotto di vaccini (l'ID del lotto è '100'), e inizia con 150 colpi standard (cioè contiene 150 colpi da 0,2 cc). Ci sono già due colpi di vaccinazione da questo lotto, uno da 0,2 cc, l'altro da 0,3 cc). E l'attuale quantità di 120 è ovviamente sbagliata, e abbiamo bisogno di ricalcolarlo e aggiornarlo.
Ecco la mia domanda:
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
);
E infatti, Oracle inizia a lamentarsi "mancanti parentesi destra". Sembra che pensi che ci sia qualcosa di sintatticamente sbagliato.
Qualcuno può aiutare a dare un'occhiata a questa query e vedere cosa c'è di sbagliato in esso? Grazie!
Questo è ciò che ottengo quando l'eseguo tramite 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
A proposito, sto usando la versione 10.2.0.1.0 di SQL * Plus. Ottengo lo stesso risultato quando utilizzo SQL Developer (versione 3.0.04).
Qualcuno può dare un'occhiata a questo problema? Grazie!
Grazie mille per aver pubblicato definizioni di tabelle e dati di esempio! Sarebbe anche utile indicare esplicitamente quale dovrebbe essere il risultato atteso dell'istruzione 'UPDATE'. Penso che un 'QUANTITY_ON_HAND' di 147.5 sia corretto, ma tu ovviamente sai meglio di me quello che vuoi che sia il risultato. –
Nel tuo copia e incolla da SQL * Plus, sembra che qualcosa venga interrotto. Quando hai pubblicato la tua query inizialmente (e quando l'ho eseguita) c'era un extra 't_id) -' sulla riga 4. Se non è effettivamente lì, verrebbe visualizzato un errore di parentesi mancante. –
Era un problema di visualizzazione, credo. Ho riformattato la query in modo che nulla venga troncato (vedi il mio post originale, che è stato aggiornato), e ho ancora finito con lo stesso risultato. – Hua