2010-06-07 62 views
2

请帮助优化这个查询:优化 “不是在” 查询

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 

回答

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

这是我在想什么。此外,如果您不想要返回额外列,则可以将整个“MAX(...)”表达式移动到“HAVING”子句中。 – VeeArr 2010-06-07 05:40:10

+0

非常感谢。我用这样的: SELECT ts.SiteId,COUNT(ts.SiteId)AS计数FROM TS GROUP BY ts.SiteId HAVING MAX(CASE WHEN ts.uniqueid = 'xxx' 的THEN ELSE 1 END 0)= 0 ORDER BY Count DESC – Zero 2010-06-07 05:50:36

+0

我喜欢这个答案,但是我想从概念上知道为什么这样做会更好。也许JOIN类型有所不同? – Daniel 2011-10-23 16:27:49

0

在SQL 2005 CTE,它可能是这样的:


; 
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