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

      

+2


source to share


3 answers


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

      

+1


source


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.

+1


source


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

      

0


source







All Articles