|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
[HyperSQL] somma condizionale (quando la condizione è in alltra tabella)
Buonasera
per necessità mi sto avvicinando (autonomamente e con quanto trovo in rete) al linguaggio HSQLDB sono riuscito a scivere una piccola routine ma non riesco a farle fare ancora tutto quello che vorrei. Vediamo se riesco a farmi capire, semplificando la mia situazione è: - ho due tabelle A("id", "flag", altro...) B ("id", "articolo", "quantità", altro...) - id : numero dello scontrino - il flag è "pagato" "non pagato" quello che la routine fà (ad ogni nuovo ordine) è : sommare la quantità di un determinato articolo (nella tabella B succede che: ) (ovviamente lo stesso articolo è ripetuto più volte) (ovviamente a diversi articoli può corrispondere uno stesso id(n.scontrino) ) quello che vorrei far fare è : sommare la quantità di un determinato articolo se questo è stato pagato da cui la mia richiesta somma condizionale ma con la condizione in un'altra tabella ho provato : Codice:
SELECT SUM ("quantità") AS nmele FROM B WHERE "articolo" LIKE 'mele' AND "id" = (SELECT "id" FROM A WHERE "flag" = pagato);
Come andrebbe fatto quello che vorrei fare ? con le primary_key e foreign_key ? Prima che vi lanciate in 1000 commenti sappiate che : - si tratta di un programma java interfacciato ad un database, già fatto, che mi mette a disposizione un database manager (in forma di GUI) - perciò le possibilità di manovra sono limitate : si puo aggiungere qualcosa ma non modificare Lato sofware : OS W7x64, java 7.80, HSQLDB v.2.3.0 p.s. per uso privato/non commerciale : qualunque codice verrà fuori dalla discussione NON sarà assolutamente distribuito ad altri p.s. se non se capisce na mazza... non esitate a dirmelo EDIT : risolto
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w Ultima modifica di Chimico_9 : 28-10-2015 alle 14:19. |
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2005
Messaggi: 395
|
Ciao
Non è una struttura pulitissima quella che hai. Comunque se sostituisci invece di usare AND "id" = inserisci una condizione di IN funziona. Ovviamente nella tabella B potresti avere più ID con lo stesso articolo ? |
|
|
|
|
#3 | |||
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
non è colpa mia
Quote:
ho fatto così e sembra andare: Quote:
Quote:
(condizione che avevo già posto con il mio (ovviamente lo stesso articolo è ripetuto più volte)) @ coffe_killer : sono subito da te
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
|||
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
Quote:
ed è numericamente uguale a id di A (tabella che raccoglie gli scontrini) (in realtà gli id hanno nomi diversi, ma li ho scritti uguali per far capire che il valore numerico è lo stesso) 2- SI, la relazione tra le due tabelle è quell'id 3 - la mia letteratura: http://www.html.it/guide/guida-linguaggio-sql/ http://www.programmingforfuture.com/...ql-hsqldb.html http://hsqldb.org/doc/guide/index.html (questo è il manuale di HSQLDB, ma dovrebbero scrivere a caratteri cubitali : "only for advance user", così non c'avrei neanche provato...
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w Ultima modifica di Chimico_9 : 13-10-2015 alle 10:21. |
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Jan 2005
Messaggi: 395
|
Quote:
Quote:
Ciao |
||
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
Quote:
ma figurati, l'ho scritto subito che se non si capiva di chiedere, hai fatto bene
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
Aggiornamento
allora :
- il costrutto funziona se lanciato manualmente - messo nel TRIGGER non più forse è necessario allargare il discorso, nel trigger faccio qualcosa del tipo : Quote:
. in grassetto le tabelle . in corsivo la variabile . AS è stato sostituito da INTO . mySellTable è stata precedentemente creata e popolata di qualcosa risultato : celle vuote in mySellTable dubbi : -c'è un limite alla lunghezza (in caratteri) di un singolo comando ? -l' IN puo restituire TRUE FALSE Null ? -nel caso sommassi numeri e Null (è da considerarsi come uno 0 ?) idea : puo avere senso fare una VIEW delle due tabelle? non so come si faccia ma mi studio la cosa se mi dite che è fattibile
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
Vado per punti ma non come li hai messi giù tu :
1 - il dubbio mi è venuto per il fatto che "singolarmente ok, nel trigger K.O." preciso che il trigger senza il comando IN funziona correttamente (ovviamente non il risultato numerico) 2 - mi sono espresso male : se IN mi restituisce una tupla vuota poi il SELECT SUM restituisce 0 o null ? 3 - Quote:
Quote:
(ovviamemte nell'insert o update ci devono essere tutti i relativi valori) 4 - letteratura giusto sufficiente a capire vagamente come funziona un database; non ho pretese, vorrei giusto mettere a punto questo script per una mia comodità; Infatti le prime dritte me le ha datte un amico che ha studiato informatica ma... alcuni argomenti piacciono, altri no e quindi... P.s. coffe_killer le tue parole non sono vane, riesco (per il momento) a seguirti.
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
||
|
|
|
|
#9 | |||
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
1 -
2 - succede propio questo 3 - ho fatto questo controllo : Quote:
ora io ti chiedo : perchè ? Quando lo stesso identico comando (fatta eccezione per INTO sostituito da AS), lanciato "a mano" dalla gui del dbmanager, mi restituisce il valore esatto ??? Quote:
Quote:
) vada in giro a fare consulenza sull'argomento (il che provoca un generale);non preoccuparti dello sfogo
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w Ultima modifica di Chimico_9 : 16-10-2015 alle 17:35. |
|||
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
Quote:
Quote:
Chiedo a chiunque di NON quotare il codice che ora riporto in quanto poi provvederò a sostituirlo con la versione "edulcorata" quando si troverà la soluzione Codice:
codice superfluo eliminato - potrebbero esserci degli errori di trascrizione e non di codice, fatemeli notare - ogni "pietanza" puo essere composta da un numero variabile di "pezzi di carne" (salsicce e/o costicine), numero di cui il programma originale non tiene conto - trigger perchè? voglio una risposta "on-line" - in allegato ciò che il trigger ora mi restituisce alla prima attivazione
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w Ultima modifica di Chimico_9 : 28-10-2015 alle 14:20. |
||
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
Quote:
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
|
|
|
|
|
#12 | ||
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
uffaaaaaaaaaaaaaaaaaaaa altro roba da studiare...
Quote:
la procedure bisogna chiamarla (call ...) (sbaglio ?) per integrare un CALL dovrei metter mano al codice del programma, cosa che non mi è concessa. potrei creare un trigger che chiama un procedure ? (così il trigger è di 3 righe di codice = a prova di nabbo) (così la procedure si becca tutta la roba e posso fare il debug dalla GUI semplicemente col comando CALL) Quote:
al di là delle tue opinioni, il codice che ho postato l'hai analizzato ? per capire se ho sbagliato qualcosa? se pretendo troppo? se c'è qualche concetto/filosofia dietro ai trigger che impedisce di fare quello che gli chiedo? mi metto al lavoro
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
||
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
ho fatto ciò :
Codice:
CREATE PROCEDURE "num_cost_sals"() MODIFIES SQL DATA BEGIN ATOMIC "gli stessi comandi del trigger" END Codice:
CALL "num_cost_sals"(); e nessun errore o warning se invece faccio : Codice:
INSERT INTO "PUBLIC"."myTempTable" VALUES (
(SELECT SUM ("ITEM_QT") FROM "PUBLIC"."TICKETITEM" WHERE "ITEM_ART" = 16 AND "ITEM_TICKET" IN (SELECT "TICKET_KEY" FROM "PUBLIC"."TICKET" WHERE "TICKET_STUS" = 20)),
"il resto delle voci necessarie a popolare la tebella"
);
deduco che c'è un'incompatibilità tra il comando SET ed IN ?!?!?!?!?!
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w Ultima modifica di Chimico_9 : 27-10-2015 alle 20:46. |
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
Quote:
che poi l'unico punto da monitorare è il SELECT SUM etc. IN etc. e quello è piuttosto evidente che mi restituisca null
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
|
|
|
|
|
#15 | ||
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
Come facevo nel trigger:
Quote:
Come andrebbe fatto : Quote:
EDIT : ringrazio Maui78 e coffe_killer per essere intervenuti ed al tempo stesso li rimproverò per non avermi suggerito quest'altro modo di valorizzare le variabili
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w Ultima modifica di Chimico_9 : 28-10-2015 alle 14:27. |
||
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
tranqui ! Era per fare una battuta
rimanete sintonizzati che ho un'altra cosa da chiedere ma prima me la devo studiare un pò...
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
rieccociquà! l' "altra cosa da chiedere" si è rilevata più semplice del previsto (aveva a che fare col formato TIME)
ma non preoccupatevi, ne ho un'altra di riserva : c'è un modo per eseguire del codice SQL (es.: di una procedure) ad intervalli di tempo prestabiliti, non legati ad alcun evento che agisca "in background" senza inficiare altre operazioni sul database ??? (es. c'è attiva questa temporalizzazione, vengono eseguite operazioni sul database, scatta il timer e viene eseguito il mio codice, riprendono le operazioni sul database fino al prossimo timer) se non si fosse capito, quello che vorrei è fare un check periodico su alcuni valori ed eventualmente intraprendere delle azioni o il fatto di lavorare con un database implica che "non ha senso compiere un'azione se il database non è stato prima modificato" ? p.s. mi andrebbe bene anche un trigger con un delay (es.1 secondo), giusto il tempo che il database venga aggiornato dall'azione in corso p.s. al solito : se non mi son fatto capire ditelo apertamente
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
UP
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
|
|
|
|
#19 | ||
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
Quote:
si scherza purtroppo ho le mani legate, il programma non posso toccarlo, cos'altro potrei usare per fare quello che devo fare ? il trigger è uno solo -> se qualcosa va in vacca sò con chi prendermela Quote:
ho trovato questo http://hsqldb.org/doc/2.0/util-guide...pt.html#N10AA5 e mi sembra che questo sqltool si appoggia ad un "modulo" esterno (AutoSys, Quartz, ...) per questa funzione il modulo è a sua volta programmabile in Java ... la cosa sta diventando esponenzialmente sempre più complessa mi fermo qui mi accontento di eseguire il trigger ad ogni insert nella tabella d'interesse sperando che questo non mandi in crisi il database manager (si tenga conto che ho solo 2 tabelle "attive" con al massimo 2000 righe : non dovrebbe essere un problema gestirle... vero?) poi con una IF ho fatto in modo che lo script mi aggiorni solo se sono passati più di 10min dall'ultimo aggiornamento
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
||
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 6309
|
ok coffe_killer
grazie per l'aiuto e la pazienza mi confermi che un DBmanager riesce a gestire cose ben peggiori di 2 tabelle con 2000 righe e 1 routine ? ora ho un problema con Java (eseguire .jnlp con una particolare versione) ma credo sia meglio aprire un nuovo thread
__________________
NON aggiornare a W10 e LEGGI QUEL DANNATO MANUALE !!! (qualunque esso sia) risolverai il 99.9% dei problemi GX620 + 840evo ; P5Q-pro + E5440 + HD4890 + EZcool 750w |
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:25.











) vada in giro a fare consulenza sull'argomento (il che provoca un







