Group: microsoft.public.it.sql




Subject: Problema query sql
From: giorgio rancati
Date: 3/9/2007 7:12:13 PM
"Byrollo" <Byrollo@discussions.microsoft.com> ha scritto nel messaggio news:BC2F2DB4-B0B2-494B-90D7-AB7FEE11F463@microsoft.com... > Ciao a tutti, il mio problema è questo: [CUT] > Come faccio a fare una query per ottenere i soli badge mai assegnati e > quelli disponibili (che sono stati riconsegnati e hanno cioè lo stato = > 'Disponibile' nella tabella assegnazioni): > Risultato campi: Id_badge, NumBadge > 2 - num2 > 3 - num3 Ciao, se ho capito il problema, così dovrebbe andare, se invece i dati evolvono nel tempo in modo diverso da quanto hai mostrato, sarebbe meglio vedere un esempio di tale evoluzione. ---- use tempdb GO CREATE Table Badge_Q (Id_badge Int, NumBadge Varchar(20)) CREATE Table Assegnazioni (id Int, p_badge Int, stato Varchar(20), data Datetime) INSERT Badge_Q SELECT 1,'num1' UNION ALL SELECT 2,'num2' UNION ALL SELECT 3,'num3' INSERT Assegnazioni SELECT 1,1,'Assegnato', '20070101' UNION ALL SELECT 2,2,'Disponibile', '20070110' UNION ALL SELECT 3,1,'Disponibile', '20070115' SELECT B.* FROM Badge_Q B LEFT JOIN Assegnazioni A ON B.Id_badge=A.p_badge LEFT JOIN Assegnazioni A1 ON B.Id_badge=A1.p_badge AND A1.Stato='Assegnato' WHERE (A.Stato='Disponibile' OR A.Id IS NULL) AND A1.id IS NULL DROP TABLE Badge_Q,Assegnazioni ---- Risultato Id_badge NumBadge ----------- -------------------- 2 num2 3 num3 Ciao -- Giorgio Rancati [Office Access MVP]

Subject: Problema query sql
From: giorgio rancati
Date: 3/9/2007 7:23:46 PM
"giorgio rancati" <giorgio_No_Spalmer_rancati@tiscali.it> ha scritto nel messaggio news:OxCcjZnYHHA.2448@TK2MSFTNGP02.phx.gbl... se sei assolutamente sicuro che il campo stato contenga solo 'Assegnato' o 'Disponibile' allora basta fare così ---- SELECT DISTINCT B.* FROM Badge_Q B LEFT JOIN Assegnazioni A ON B.Id_badge=A.p_badge AND A.Stato='Assegnato' WHERE A.Id IS NULL ---- Ciao -- Giorgio Rancati [Office Access MVP]

Subject: Problema query sql
From: giorgio rancati
Date: 3/10/2007 1:38:16 AM
"Byrollo" <Byrollo@discussions.microsoft.com> ha scritto nel messaggio news:96A7F641-FA2A-4687-9C92-9A94BE59FF63@microsoft.com... > Sei stato utilissimo e ti ringrazio tanto. La query funziona a dovere! Ti > sarei molto grado se riuscissi in qualche modo a spiegarmi il meccanismo > di > funzionamento che non mi è affatto chiaro :( Non sapevo si potesse fare > quel > tipo di join (AND A.Stato='Assegnato') > Saresti così cortese da farmi capire il meccanismo? ok, ci provo :-) parto da una query più intuitiva che rende lo stesso risultato ---- SELECT * FROM Badge_Q WHERE Id_badge NOT IN (SELECT p_badge FROM Assegnazioni WHERE Stato='Assegnato') ---- (le subquery cerco di non usarle perchè in Access sono estremamente lente) adesso trasformo la subquery della clausola Where in tabella derivata nella From, ottenendo una query che rende sempre lo stesso risultato ---- SELECT B.* FROM Badge_Q B LEFT JOIN (SELECT * FROM Assegnazioni WHERE Stato='Assegnato') A ON B.Id_badge=A.p_badge WHERE A.Id IS NULL ---- l'Sql 92 permette di eseguire il confronto Stato='Assegnato' sulla tabella Assegnazioni prima di metterla in outer join con Badge_Q se si mette la condizione nella ON della Join. Quindi.scrivendola in questo modo ---- SELECT B.* FROM Badge_Q B LEFT JOIN Assegnazioni A ON B.Id_badge=A.p_badge AND A.Stato='Assegnato' WHERE A.Id IS NULL ---- si ottiene una query uguale alla precedente. ps. non conoscendo le possibili varianti dei dati, avevo messo per sicurezza una Distinct. Se non serve toglila > Grazie infinite Prego :-) Ciao -- Giorgio Rancati [Office Access MVP]