Sql: where subquery is not null
I have the following sql query and I want to filter the results when the alias image file is null, but I cannot get it to work. it's kind of basic sql ... sorry about that!
SELECT Categorie.CategorieID, Categorie.Highlight, CategorieTaal.CategorieNaam,
(SELECT TOP (1) ImageFile
FROM Artikel WHERE (CategorieID = Categorie.CategorieID)
AND (Onzichtbaar = 0)
AND (NietBestelbaar = 0)
AND (Voorraad = - 1000 OR Voorraad > LevertijdDrempel)
ORDER BY Volgnummer, ArtikelID DESC) AS 'imagefile'
FROM Categorie INNER JOIN
CategorieTaal ON
Categorie.CategorieID = CategorieTaal.CategorieID
WHERE (Categorie.CategorieGroepID = @catgroepid)
AND (Categorie.Onzichtbaar = 0)
AND (CategorieTaal.TaalCode = @tc)
ORDER BY Categorie.Volgnummer, CategorieTaal.CategorieNaam
source to share
You might want to try the following:
SELECT Categorie.CategorieID, Categorie.Highlight, CategorieTaal.CategorieNaam,
FROM Categorie
INNER JOIN
CategorieTaal ON
Categorie.CategorieID = CategorieTaal.CategorieID
WHERE (Categorie.CategorieGroepID = @catgroepid)
AND (Categorie.Onzichtbaar = 0)
AND (CategorieTaal.TaalCode = @tc)
AND NOT EXISTS (SELECT 1 ImageFile
FROM Artikel WHERE (CategorieID = Categorie.CategorieID)
AND (Onzichtbaar = 0)
AND (NietBestelbaar = 0)
AND (Voorraad = - 1000 OR Voorraad > LevertijdDrempel))
ORDER BY Categorie.Volgnummer, CategorieTaal.CategorieNaam
source to share
You can optimize this by using inner join
again instead of trying to use the subquery twice:
SELECT
c.CategorieID,
c.Highlight,
ct.CategorieNaam,
a.ImageFile
FROM
Categorie c
INNER JOIN CategorieTaal ct ON
c.CategorieID = ct.CategorieID
INNER JOIN
(select
CategorieID,
ImageFile,
row_number() over (partition by CategorieID) as rownum
from
Artikel
where
Onzichtbaar = 0
and NietBestelbaar = 0
and (Voorraad = -1000 OR Voorraad > LevertijdDrempel)) a ON
c.CategorieID = a.CategorieID
and a.rownum = 1
WHERE
c.CategorieGroepID = @catgroepid
AND c.Onzichtbaar = 0
AND ct.TaalCode = @tc
ORDER BY c.Volgnummer, ct.CategorieNaam
Since you are using SQL Server (or at least I think you have top
something else) you can take advantage of row_number
. This will return whatever ImageFile
you want without having to do two correlated subqueries (usually performance killers).
Also, here you only need to keep this subquery in one place, not in two different parts of your query.
source to share
found it !!
SELECT Categorie.CategorieID, Categorie.Highlight, CategorieTaal.CategorieNaam,
(SELECT TOP (1) ImageFile
FROM Artikel
WHERE (CategorieID = Categorie.CategorieID)
AND (Onzichtbaar = 0)
AND (NietBestelbaar = 0)
AND (Voorraad = - 1000
OR Voorraad > LevertijdDrempel)
ORDER BY Volgnummer, ArtikelID DESC) AS 'imagefile'
FROM Categorie
INNER JOIN CategorieTaal ON Categorie.CategorieID = CategorieTaal.CategorieID
WHERE (Categorie.CategorieGroepID = @catgroepid)
AND (Categorie.Onzichtbaar = 0)
AND (CategorieTaal.TaalCode = @tc)
AND ((
SELECT TOP (1) ImageFile
FROM Artikel AS Artikel_1
WHERE (CategorieID = Categorie.CategorieID)
AND (Onzichtbaar = 0)
AND (NietBestelbaar = 0)
AND (Voorraad = - 1000
OR Voorraad > LevertijdDrempel)
) IS NOT NULL)
ORDER BY Categorie.Volgnummer, CategorieTaal.CategorieNaam
source to share