PDA

View Full Version : [SQL] Scrivere funzione di controllo sui record


som
05-05-2009, 09:13
Salve a tutti,
conosco solo le basi dell'SQL e non ho ben capito se si può fare quello che ho in mente.

I record di una tabella (per come viene compilata) devono rispettare determinate regole:
Se un campo1 ha valore 0 (può assumere solo due valori) devo considerere il valore di altri 2 campi e verificare che al record successivo questi 2 campi abbiano lo stesso valore mentre il campo1 abbia valore 1. Se verifico che la tabella segue questo schema allora non ho avuto "errori" in fase di compilazione.

Ricapitolando in una sorta di pseudo codice, per tutta la tabella dovrei fare qualcosa del genere

If campo1_rec1 = 0
{
valore1 = campoX_rec1,
valore2 = campoY_rec1
If campo1_rec2=0
{
ERRORE
}
ELSE
{
valore1b = campoX_rec2,
valore2b = campoY_rec2
if (( valore1!=valore1b) OR (valore!=valore2b) {
ERRORE
}
}
}


qualcuno mi saprebbe dare qualche dritta su come farlo fare direttamente al db? In alternativa potrei farlo nel mio programma... ma credo sia più performante il DB.

Grazie.

gugoXX
05-05-2009, 10:51
Si puo' fare.
In SQL Standard pero' sono 2 paia di wallas.
Che motore hai?
PS: Se mi dici MySql lascio subito per principio. So che su questo forum sono vietate le apologie, ma ho deciso che MySql non sara' piu' una mia opzione a priori.

Inoltre, cosa significa "Al record successivo", dato che per l'SQL i record di una tabella non hanno alcun ordine preferenziale particolare?
(Ogni volta che leggi da una tabella, senza imporre alcun ORDER BY, i record possono essere restituiti in un ordine qualsiasi, anche apparentemente casuale).

som
05-05-2009, 11:29
Grazie gugoXX,

per motore cosa intendi? Io uso SQL SERVER Express 2005, ti servono altre info?

Ogni record ha un campo Identificativo univoco autoincrementato dal db stesso e su cui sono sicuro di non avere problemi... quindi direi richiamando i record con un ORDER BY CampoIdentificativoUnivoco.

gugoXX
05-05-2009, 11:37
Sisi', per motore intendevo proprio l'engine, SqlServer per esempio.
Vediamo...

gugoXX
05-05-2009, 11:42
Ecco, chiamati ciu l'identificatore univoco
campos2 il primo campo di cui testare l'uguaglianza, campos3 il secondo campo di cui testare l'ugliaglianza


SELECT COUNT(*) FROM tab AS t1
WHERE campo1=0 AND
EXISTS (SELECT 1 FROM tab AS t2
WHERE t2.ciu = t1.ciu+1
AND (t2.campo1!=1
OR t2.campos2!=t1.campos2
OR t2.campos3!=t2.campos3
)
)


Tale query restituisce errore se la clausola sul campo univoco NON e' soddisfatta. Cio' seignifica che dopo un campo1=0 allora necessariamente, come da tua richiesta, il record successivo deve avere campo1=1 e i due campos uguali al riferimento, altrimenti sempre e comunque errore.

Errore significa che la query restituira' qualcosa di diverso da 0 (o da NULL se la tabella e' vuota)

som
05-05-2009, 12:30
Grazie gugoXX provo subito! :D

som
05-05-2009, 12:52
Adattato ai veri nomi e... FUNZIONA!!!!! :D

Grazie mille davvero!