Select restituisce dati sbagliati

sabato 17 maggio 2014 - 22.40
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio 2010  |  MySQL 5.5

Mau67 Profilo | Expert

Ciao al forum,
la select che ho scritto mi restituisce tutti i record presenti nelle tabelle nonostante li filtro
Select
If(Maschi_Inf25.Nr_M Is Null, 0, Maschi_Inf25.Nr_M) As Nr_M_Inf25
From
(Select
Count(paziente.Sesso) As Nr_M
From
paziente Inner Join
cartella_sanitaria
On paziente.CodiceFiscale = cartella_sanitaria.CodiceFiscale Inner Join
esame_clinico_generale_cartella On cartella_sanitaria.ID =
esame_clinico_generale_cartella.ID_Cartella Inner Join
paziente_azienda On paziente.CodiceFiscale = paziente_azienda.CodiceFiscale
Where
(cartella_sanitaria.PartitaIva = '02770830236' And
Year(cartella_sanitaria.Data_Visita) = 2014 And
paziente_azienda.Sede_Operativa = 'FA77D21B-D803-412A-B8D7-CE0B7F649C75' And
paziente.Sesso = 'M' And
esame_clinico_generale_cartella.PA Between 0 And 139) Or
(esame_clinico_generale_cartella.PA1 Between 0 And 89)) Maschi_Inf25

Se tolgo Or
(esame_clinico_generale_cartella.PA1 Between 0 And 89) allore restituisce il risultato esatto.
Il problema che è un parametro che devo inserire.
Qualcuno può aiutarmi Grazie
Mau67

0v3rCl0ck Profilo | Guru

Innanzitutto ti consiglio sempre di indentare molto bene query complesse come questa per riuscire a capire bene tutte le parti dell'espressione:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Non so per risultato esatto cosa intendi, perchè non sapendo i dati non so cosa ti aspetti da questa query, quello che sicuramente succede è che la sub-query verrà valutata e ritornerà tutte le righe che rispecchiano questa clausola:

cartella_sanitaria.PartitaIva = '02770830236' And Year(cartella_sanitaria.Data_Visita) = 2014 And paziente_azienda.Sede_Operativa = 'FA77D21B-D803-412A-B8D7-CE0B7F649C75' And paziente.Sesso = 'M' And esame_clinico_generale_cartella.PA Between 0 And 139

oppure questa

esame_clinico_generale_cartella.PA1 Between 0 And 89

quindi dato che la prima mi sembra molto selettiva, penserei che tutte le righe soddisfino la condizione "esame_clinico_generale_cartella.PA1 BETWEEN 0 AND 89"

un piccolo HINT: se devi solo contare le righe puoi mettere così:

SELECT COUNT(*) AS Nr_M
oppure
SELECT COUNT(1) AS Nr_M

invece che:

SELECT COUNT(paziente.Sesso) AS Nr_M

questo evita al query engine di dovere valutare la colonna Sesso per niente, una piccolissima ottimizzazione, che però puoi tenere in considerazione: http://goo.gl/mQNUWM


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

Mau67 Profilo | Expert

Grazie della risposta ho risolto ripetendo i filtri dopo OR posto il codice se serve a qualcuno

[code\]"Select" & _
" If(Maschi_Inf25.Nr_M Is Null, 0, Maschi_Inf25.Nr_M) As Nr_M_Inf25" & _
" From" & _
" (" & _
" Select" & _
" COUNT(*) As Nr_M" & _
" From" & _
" paziente" & _
" Inner Join cartella_sanitaria On paziente.CodiceFiscale = cartella_sanitaria.CodiceFiscale" & _
" Inner Join esame_clinico_generale_cartella On cartella_sanitaria.ID = esame_clinico_generale_cartella.ID_Cartella" & _
" Inner Join paziente_azienda On paziente.CodiceFiscale = paziente_azienda.CodiceFiscale" & _
" Where" & _
" (" & _
"cartella_sanitaria.PartitaIva = '" & ComboBox1.SelectedValue & "'" & _
" And Year(cartella_sanitaria.Data_Visita) = '" & ComboBox4.Text & "'" & _
" And paziente_azienda.Sede_Operativa = '" & ComboBox3.SelectedValue & "'" & _
" And paziente.Sesso = 'M'" & _
" And esame_clinico_generale_cartella.PA Between 0 And 139" & _
")" & _
" Or" & _
" (" & _
" esame_clinico_generale_cartella.PA1 Between 0 And 89" & _
" And cartella_sanitaria.PartitaIva = '" & ComboBox1.SelectedValue & "'" & _
" And Year(cartella_sanitaria.Data_Visita) = '" & ComboBox4.Text & "'" & _
" And paziente_azienda.Sede_Operativa = '" & ComboBox3.SelectedValue & "'" & _
" And paziente.Sesso = 'M'" & _
")) Maschi_Inf25", Connection)[/code]
grazie
Mau67

0v3rCl0ck Profilo | Guru

probabilmente ho capito meglio cosa ti serviva, e forse il tuo filtro voleva essere così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

così questi filtri sono sempre alla base, e devono sempre essere verificati:

cartella_sanitaria.PartitaIva = '02770830236' And Year(cartella_sanitaria.Data_Visita) = 2014 And paziente_azienda.Sede_Operativa = 'FA77D21B-D803-412A-B8D7-CE0B7F649C75' And paziente.Sesso = 'M'

mentre qui può andare bene sia che PA sia tra 0 e 139 che PA1 sia tra 0 e 89 per restituire i record:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Ciao

Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5