2009-09-07 64 views
2

我有以下的sql查询,我想过滤alias imagefile为空的结果,但我无法让它工作。这是一个基本的SQL ...对不起!sql:where subquery not null

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 

回答

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 
+0

一件小事:第一行有一个','太多。和'NOT'应该不在查询中才能得到正确的结果。 执行时间:129在sql管理工作室 – 2009-09-08 14:33:46

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 
+0

执行时间:210:S(可能的最差选项atm) – 2009-09-08 14:34:50

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而不需要必须做两个相关的子查询(通常是性能杀手)。

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

+0

哇真令人印象深刻。我不是那么好的sql.it的确是sql server2005,但当我跑你的查询我得到了:排名函数“row_number”必须有一个ORDER BY子句。所以我改变行row_number()到: row_number()over(由CategorieID order by artikelid desc分区)作为rownum 但当我在管理工作室包括'客户统计'它说,它不是更快,然后我在where子句中发布了子查询。也许我在看SQL Server 2008中的错误号码2008?我如何测量它肯定?感谢您的回复,我从中学到了 – 2009-09-08 14:29:33

+0

在sql studio中的执行时间(找到正确的数字)146 – 2009-09-08 14:34:19