2009-09-07 5 views
2

У меня есть следующий sql-запрос, и я хочу отфильтровать результаты, когда файл псевдонима является нулевым, но я не могу заставить его работать. это своего рода базовый 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

одна маленькая вещь: на первой строке слишком много «слишком». и «НЕ» должен быть вне запроса, чтобы получить правильные результаты. время исполнения: 129 в студии управления sql –

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) –

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

wow действительно впечатляет. я не так хорош с sql.it действительно sql server2005, но когда я выполнил ваш запрос, я получил: функция ранжирования «row_number» должна иметь предложение ORDER BY. , поэтому я изменил строку с помощью row_number() на: row_number() over (раздел по порядку категорий CategorieID по artikelid desc) как rownum , но когда я включил «статистику клиентов» в студию управления, он сказал, что это не быстрее, чем один я отправил с подзапросом в предложение where. возможно, я смотрю на неправильные цифры в студии управления sql 2008? как я могу измерить его точно? спасибо за ваш ответ, я узнал от него –

+0

время выполнения в студии sql (найдено нужный номер) 146 –