Newsgroup: it.comp.appl.access
Titolo: Ricerca dati non corrispondenti

 
          Ciao a tutti,
ho bisogno del vostro prezioso aiuto! Allora ho una tabella di "anagrafica
pazienti", una con le attività riabilitative e un'altra che indica il
calendario delle attività del centro, quindi ho costruito una query che mi
tira fuori tutti i pazienti che devono svolgere delle attività riabilitative
esempio:
pincopallino lunedì attività motoria
mario rossi martedì nuoto
Giovanni martedì palestra
ecc ecc...
Ora ho la necessità di trovare tutti coloro che in un determinato giorno
della settimana non hanno nessuna attività assegnata! Come posso fare? Ho
provato con la procedura guidata "Ricerca dati non corrispondenti" ma i dati
non sono corretti! Chi sa darmi una mano?
Grazie infinite!
Francesco
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


supponendo che nella tab calendario salvi il codice dell'anagrafica del
paziente (io li ho chiamati _paid dove è contatore chiave, e _pid dove è
numenrico chiave esterna;
prova con una query simile:
SELECT anagrafica.cognome, anagrafica.nome
FROM anagrafica LEFT JOIN calendario ON anagrafica.anagrafica_paid =
calendario.anagrafica_pid
WHERE (((calendario.data) Not Between #1/1/2004# And #1/5/2004#));
ti estrae nome e cognome di tutti i pazienti che non hanno prenotato
prestazioni nel periodo tra le 2 date
il "trucco" sta nel "anagrafica LEFT JOIN calendario " ti da tutti i dati di
anagrafica indipendentemente dal fatto che abbiano prenotato o no, poi ti
basta filtrare 1 dei campi della tab calendario per avere quelli senza
prenotazioni e già che ci sei dovendo verificare un intervallo di date
filtra direttamente sulla data
spero di aver capito e chiarito !
ciao
Giovanni T


 
più veloce così
SELECT anagrafica.cognome, anagrafica.nome
FROM anagrafica 
WHERE anagrafica.anagrafica_paid NOT IN 
     (SELECT calendario.anagrafica_pid 
      FROM calendario
      WHERE ((calendario.data) Not Between #1/1/2004# And #1/5/2004#));
Ciauz
--
'gnurant come una cucuzza
Inviato da 
www.mynewsgate.net

 ha scritto nel messaggio
news:200408041...@mynewsgate.net...

doppio NOT ?
forse volevi fare così
-------------
 SELECT anagrafica.cognome, anagrafica.nome
 FROM anagrafica
 WHERE anagrafica.anagrafica_paid NOT IN
      (SELECT calendario.anagrafica_pid
       FROM calendario
       WHERE ((calendario.data) Between #1/1/2004# And #1/5/2004#));
---------------
(una subquery non è mai più veloce di una JOIN perchè viene valutata per
ogni riga)
Ciao Giorgio

 ha scritto nel messaggio
news:81Z208Z60Z192Y1...@usenet.libero.it...

Ciao,
la tua query non include le anagrafiche che non hanno mai prenotato, è vero
che la left join rende tutte le anagrafiche ma se una di esse non ha mai
prenotato il campo Calendario.Data conterrà NULL e qualsiasi operatore di
confronto in presenza di NULL restituisce UNKNOW.
io la farei così
--------------
 SELECT anagrafica.cognome, anagrafica.nome,Data
 FROM anagrafica LEFT JOIN
           (SELECT Anagrafica_Pid,Data
            FROM Calendario
            WHERE data Between #1/1/2004# And #5/1/2004#) AS Calendario
ON anagrafica.anagrafica_paid = calendario.anagrafica_pid
WHERE Calendario.Anagrafica_Pid IS NULL
---------------
Ciao Giorgio

 ha scritto:

Già, ho dimenticato di togliere il not nella where...comunque sbagli 
dicendo che il join è sempre più veloce. In, Exist e gli altri 
operatori annidati sono molto più rapidi. Vero è che la subquery è 
valutata per ogni riga, ma poi il join avviene tra due tabelle, 
anagrafica e la sottotabella di calendario. Col JOIN valuti tutte le 
righe di entrambe le tabelle.


 Ciauz
devi considerare di moltiplicare la select della subquery per le righe
dell'anagrafica. Se l'anagrafica ha 1000 righe e la subquery ne rende 100
per 1000 volte verranno estratte le 100 righe per un totale di 100.000 (e
questo è un caso con poche righe)
Access in queste situazioni si siede, se provi le due query con tabelle
abbastanza grosse otterrai il risultato con la Left Join in 1 secondo circa
e quello con la SubQuery in 20-30 secondi.
Se vuoi ottimizzarla ulteriormente prova a guardare qui sopra la soluzione
con la tabella derivata nella JOIN.
Ti dico queste cose solo perchè ci ho sbattuto il naso e non per puro
spirito di critica, comunque fai tu stesso la prova.
:-)
Ciao Giorgio



Ti credo...
ma la spiegazione non mi convince...
penso sia dovuto al piano di esecuzione dell'ottimizzatore di Access...
Un ottimizzatore dovrebbe creare una tabella dalla subquery, e poi usarla per 
sottrarla a quella esterna. Diventa un'esecuzione di complessità lineare 
anziché quadratica. 



Ciao,
il problema è che Access non ha un ottimizzatore come Sql Server, in Sql
Server la tua Query viene tramutata automaticamente in una LEFT JOIN, se hai
Query Analyzer puoi verificarlo guardando il piano di esecuzione.
Access esegue per 1000 anagrafiche 1000 subquery. E' piu veloce una query
che restituisce 10.000 righe che 1000 query che restituiscono 10 righe.
comunque non pretendo che tu mi creada e non sono moltto bravo a spiegarmi,
volevo solo metterti una pulce nell'orecchio e indutri a fare una prova
pratica.
Ciao Giorgio



Ma non devi pretendere di essere creduto, perché ti credo! Mi hai sempre dato 
l'impressione di sapere molto. Non mi convinceva il fatto che fosse così per 
ogni ottimizzatore di query. Infatti me lo specifichi qui anche tu che è il 
query optimizer di Access ad agire così :o) Ma prima, non specificandolo 
pensavo che parlassi in generale.
La pulce me l'hai messa, ma se andrò a fare la prova sarà solo per curiosità, 
non perché non ti credo...:o)



insomma alla fine non avevo detto proprio una cazzata
son contento!
ciao
giovanni t



Grazie
:-)
Ciao Giorgio

 (a volte non è possibile).
ah lo so che non è possibile :o))) altrimenti che le inventavano a fare?? :o)))



Ciao,
una soluzione funzionante non è mai una c.....a al limite si può discutere
sulla sua ottimizzazione
:-)
Ciao Giorgio