View Full Version : [SQL]Non riesco ad implementare una join
RaouL_BennetH
04-10-2009, 18:12
Ciao a tutti :)
Ho queste due tabelle:
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)
nella tblTurni, all'interno dei giorni della settimana vengono inseriti il numero massimo di eventi che una persona può produrre per il corrispondente giorno.
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.
first register
04-10-2009, 18:33
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)
RaouL_BennetH
04-10-2009, 19:03
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)
Ciao e grazie per aver risposto :)
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.
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")
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
Poi vado a cercare un modo per ricavare, data una data specifica,, il giorno della settimana da 1 a 7. Per semplicita' qui chiamo questa funzione DayOfWeek(data). Ciascun motore la implementa modo quasi diverso.
E con questi faccio la Join
SELECT * FROM tblLavori tb
JOIN vs_turni vs ON
(
tb.PersonaID = vs.ID_Persona
AND DayOfWeek(tb.Dataevento) = vs.giorno
)
^TiGeRShArK^
06-10-2009, 07:37
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? :mbe:
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. :asd: )
RaouL_BennetH
06-10-2009, 10:35
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.
^TiGeRShArK^
06-10-2009, 14:51
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:
int numeroEventi = new TblLavoriAdapter().getNumeroEventi(personId, date)[0].NumeroEventi;
Database.TurniRow row = new tblTurni().getTurni(personId)[0];
if (row[date.DayOfWeek] > numeroEventi)
throw Exception;
E' un esempio scritto ad cazzum che non funziona se non crei gli adapters..
Il primo presuppone una query del tipo:
SELECT NumeroEventi
FROM TblLavori
WHERE ID = @personId AND DataEvento = @date
e il secondo qualcosa di simile:
SELECT *
FROM TblTurni
WHERE ID_Persona = @personId
RaouL_BennetH
06-10-2009, 15:23
beh...
>CUT<
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 :rolleyes:
^TiGeRShArK^
06-10-2009, 17:10
vabbè...
lo puoi fare anche con NHibernate, basta utilizzare HQL o quello che vuoi al posto delle query. :p
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. :p
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.