2009-09-07 41 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