|
|
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]
|