Reputation: 97
I need to make a query like that:
SELECT DISTINCT Carta_ID
FROM Carta_Alarme
INNER JOIN Alarme ON Carta_Alarme.Alarme_ID = Alarme.ID
WHERE (
YEAR( Alarme.dtOcorrencia ) = 2011
) NOT
IN (
SELECT DISTINCT Carta_ID
FROM Carta_Alarme
INNER JOIN Alarme ON Carta_Alarme.Alarme_ID = Alarme.ID
WHERE (
YEAR( Alarme.dtOcorrencia ) = 2012
)
)
The result of first Select is (1, 5, 6). The result of the other select after "NOT IN" is (1,2,3,4,5) but the result of the total query is (1,2,3,4,5) and i need only (6).
So what i need is an EXCEPT between this selects and what i get is an INTERSECT
Upvotes: 0
Views: 167
Reputation: 74018
This is effectively a minus set operation
SELECT DISTINCT ca.Carta_ID
FROM Carta_Alarme ca
INNER JOIN Alarme a ON ca.Alarme_ID = a.ID
left join (SELECT DISTINCT Carta_ID
FROM Carta_Alarme
INNER JOIN Alarme ON Carta_Alarme.Alarme_ID = Alarme.ID
WHERE YEAR( Alarme.dtOcorrencia ) = 2012) ca2 on ca2.Carta_id = ca.Carta_id
WHERE YEAR( a.dtOcorrencia ) = 2011
and ca2.Carta_id is null
Upvotes: 0
Reputation: 33381
SELECT DISTINCT Carta_ID
FROM Carta_Alarme
INNER JOIN Alarme ON Carta_Alarme.Alarme_ID = Alarme.ID
WHERE (
YEAR( Alarme.dtOcorrencia ) = 2011
) AND Carta_ID NOT
IN (
SELECT DISTINCT Carta_ID
FROM Carta_Alarme
INNER JOIN Alarme ON Carta_Alarme.Alarme_ID = Alarme.ID
WHERE (
YEAR( Alarme.dtOcorrencia ) = 2012
)
)
Upvotes: 2
Reputation: 204756
SELECT Carta_ID
FROM Carta_Alarme
INNER JOIN Alarme ON Carta_Alarme.Alarme_ID = Alarme.ID
GROUP BY Carta_ID
HAVING sum(YEAR(Alarme.dtOcorrencia) = 2011) > 0
and sum(YEAR(Alarme.dtOcorrencia) = 2012) = 0
Upvotes: 1