2010-06-07 5 views
2

S'il vous plaît aider à optimiser cette requête:Optimize "pas dans" requête

SELECT ts.SiteId, COUNT(ts.SiteId) AS Count 
FROM ts 
WHERE ts.SiteId not in 
    (SELECT ts.SiteId FROM ts WHERE ts.uniqueid = 'xxx') 
GROUP BY ts.SiteId ORDER BY Count DESC 

Répondre

3
SELECT ts.SiteId, COUNT(ts.SiteId) AS Count, 
MAX(CASE WHEN ts.uniqueid = 'xxx' THEN 1 ELSE 0 END) As XXXUniqueID 
FROM ts 
GROUP BY ts.SiteId 
HAVING XXXUniqueID = 0 
ORDER BY Count DESC 
+0

C'est ce que je pensais. De plus, si vous ne voulez pas que la colonne supplémentaire soit retournée, vous pouvez probablement déplacer toute l'expression 'MAX (...)' dans la clause 'HAVING' à la place. – VeeArr

+0

Merci beaucoup. Je ceci: SELECT ts.SiteId, COUNT (ts.SiteId) AS compter à partir ts GROUP BY ts.SiteId AYANT MAX (CAS QUAND ts.uniqueid = 'xxx' ALORS 1 0 ELSE END) = 0 COMMANDE BY Count DESC – Zero

+0

J'aime la réponse, mais j'aimerais savoir pourquoi cela fonctionnerait mieux. Peut-être qu'il y a une différence dans le type JOIN? – Daniel

0

Dans SQL 2005 CTE, il pourrait ressembler à ceci:


; 
WITH 
e AS 
(
    SELECT ts.SiteId FROM ts 
    EXCEPT 
    SELECT ts.SiteId FROM ts WHERE ts.uniqueid = 'xxx' 
) 
SELECT e.SiteId, COUNT(e.SiteId) AS Count 
FROM e 
GROUP BY e.SiteId ORDER BY Count DESC