sql:where子查询不为null

时间:2009-09-07 13:35:29

标签: sql sql-server

我有以下sql查询,我想过滤alias imagefile为null的结果,但我无法让它工作。它有点基本的sql ...对不起!

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

3 个答案:

答案 0 :(得分:1)

您可能想尝试一下:

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 :(得分:1)

您可以再次使用inner join来优化此操作,而不是尝试使用子查询两次:

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

由于您正在使用SQL Server(或者至少我认为您使用的是top和诸如此类的东西),因此您可以利用row_number。这将只返回您需要的ImageFile没有必须执行两个相关的子查询(通常是性能杀手)。

此外,您只需在一个位置维护该子查询,而不是在查询的两个不同部分。

答案 2 :(得分:0)

发现它了!!

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