|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[SQL]Non riesco ad implementare una join
Ciao a tutti
Ho queste due tabelle: Codice:
tblLavori ID (pk) PersonaId (int) DataEvento (Date) CodiceEvento (varchar) NumeroEventi (int) tblTurni ID_Persona Monday (int) Tuesday (int) Wednesday (int) Thursday (int) Friday (int) Saturday (int) Sunday (int) Ora, non riesco a creare una relazione fra queste due tabelle in base al giorno dell'evento, cioè tra tblLavori.DataEvento e tblTurni.Monday, Tuesday & Co. Come dovrei procedere? Grazie mille RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Oct 2008
Messaggi: 326
|
Se ho capito bene tu vorresti verificare SE al giorno DataEvento (Date) la persona è di turno a disposizione per un evento ?
Dai un occhiata alla funzione dayname DAYNAME(tblLavori.DataEvento) Ultima modifica di first register : 04-10-2009 alle 18:56. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Il problema non è la funzione con la quale ricavare il nome del giorno Per rispondere alla tua domanda: Io devo solo accertarmi che se il turno del giorno 'Monday' vale "2", non devo inserire in tblLavori.NumeroEventi un valore superiore a 2.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ciao.
Per risolvere un modo potrebbe essere: Cappotto la tabella dei giorni della settimana perche' cosi' non mi serve (PS: Cappottare = termine tecnico ambivalente che sta per "normalizzare" o "denormalizzare", a seconda dei casi. Qui e' "normalizzare") Codice:
CREATE VIEW vs_turni AS SELECT ID_PERSONA, 1 AS giorno, Monday AS MaxEventi FROM tblTurni UNION ALL SELECT ID_PERSONA, 2, Tuesday FROM tblTurni UNION ALL SELECT ID_PERSONA, 3, Wednesday FROM tblTurni UNION ALL ... UNION ALL SELECT ID_PERSONA, 7, Sunday FROM tblTurni E con questi faccio la Join Codice:
SELECT * FROM tblLavori tb
JOIN vs_turni vs ON
(
tb.PersonaID = vs.ID_Persona
AND DayOfWeek(tb.Dataevento) = vs.giorno
)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 06-10-2009 alle 07:40. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Ma prestazionalmente (e anche per quanto riguarda la leggibilità) non sarebbe più efficiente fare una semplice if a livello di codice dato che *immagino* che questo sia un controllo di qualche tipo in seguito ad un immissione di dati?
![]() Così bisogna fare questa join pesantuccia su tutta la tabella, mentre in quel caso bastano due select e un if male che vada. (magari basta anche solo una select ma la mattina presto sò troppo rinco. )
__________________
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Innanzitutto grazie per aver risposto
Il check in effetti dev'essere effettuato prima dell'immisione dei dati, per evitare che in uno stesso giorno, magari per sbaglio, si inseriscano più eventi di quanti ne possa fare la persona, o quanto meno, un gestore si preoccupi di avvisare l'utente che c'è qualcosa che non va. Inizialmente avevo pensato ad un trigger del tipo 'before_insert', ma poi mi sono chiesto come avrebbe potuto interagire con l'utente e ho ritenuto che fosse un pò troppo complicato. Al momento ho risolto 'via codice'. @gugoXX: Ho seguito le tue indicazioni ed in effetti è quello che stavo cercando @^TigerShark^: potresti spiegarmi meglio cosa intendi, soprattutto in merito al discorso 'prestazionale' Grazie ancora. RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
beh...
se come ho capitato devi fare questo controllo prima del salvataggio sul db in seguito all'immissione dell'utente allora io farei semplicemente qualcosa del genere: Codice:
int numeroEventi = new TblLavoriAdapter().getNumeroEventi(personId, date)[0].NumeroEventi;
Database.TurniRow row = new tblTurni().getTurni(personId)[0];
if (row[date.DayOfWeek] > numeroEventi)
throw Exception;
Il primo presuppone una query del tipo: Codice:
SELECT NumeroEventi FROM TblLavori WHERE ID = @personId AND DataEvento = @date Codice:
SELECT * FROM TblTurni WHERE ID_Persona = @personId
__________________
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Se dovessi lavorare con gli adapter, dataset o altro, andrebbe bene anche la tua idea credo.
Il fatto è che quest'applicazione è legata ad nhibernate. Risulta quindi più semplice implementare le entità su viste o tabelle già esistenti. Altro problema, ma questo esula un pò dal 3d, è che non avendo noi a disposizione tools per la reportistica neanche di minimo livello, siamo purtroppo costretti a crearci dei 'report' direttamente lavorando sulle viste del database
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
vabbè...
lo puoi fare anche con NHibernate, basta utilizzare HQL o quello che vuoi al posto delle query. L'importante è farti restituire per una persona il numero massimo di turni per ogni giorno e il numero attuale di turni per quel giorno e quindi applicare l'if. In questo modo hai due banalissime select da scrivere in HQL o in quello che vuoi (equivalenti a quelle che ho scritto per gli adapter) e un if che controlla un'unica condizione.
__________________
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:26.













)








