2013-02-12 137 views
-2

有没有更简单的方法...?查询太长,除了

SELECT clid, cldoel, clanker, clprefix, clleerlijn, f1, f2, f3, f4 FROM Clusters 
WHERE clleerlijn like 'WJNLLUI%' AND (f3 IS NOT NULL OR f4 IS NOT NULL) 
AND clid in(
Select agClid FROM agenda2 as a JOIN evaluaties2 as e ON a.agclid = e.evalclid and agLkrid = evallkrid 
WHERE (agSchoolid='18' and agDatum >= '2013/01/01' and agDatum <= '2013/02/12') 
GROUP BY agClid 
except 
(SELECT agClid 
FROM agenda2 as a 
    JOIN evaluaties2 as e 
     ON a.agclid = e.evalclid and agLkrid = evallkrid 
WHERE agSchoolid='18' 
    and agLkrid in (1,2932,2935) 
    and agDatum >= '2013/01/01' 
    and agDatum <= '2013/02/12' 
    AND evalWaarde = 3 
GROUP BY agclid 
HAVING COUNT(DISTINCT agLkrid) = 3) 
) 
+2

使用联接而不是子查询和'except'子句可能会缩短它,但实际上你所拥有的并不是那么长。 – iamnotmaynard 2013-02-12 17:28:33

回答

0

只有一点点短,但更好的可读性,因为同样的CTE被使用了两次:

WITH cte(clid) As (
    Select agClid FROM agenda2 as a JOIN evaluaties2 as e ON a.agclid = e.evalclid and agLkrid = evallkrid 
    WHERE (agSchoolid='18' and agDatum >= '2013/01/01' and agDatum <= '2013/02/12') 
) 
SELECT clid, cldoel, clanker, clprefix, clleerlijn, f1, f2, f3, f4 FROM Clusters 
WHERE clleerlijn like 'WJNLLUI%' AND (f3 IS NOT NULL OR f4 IS NOT NULL) 
AND clid in(
    SELECT DISTINCT agClid FROM cte 
    except 
    (SELECT agClid FROM cte WHERE agLkrid in (1,2932,2935) AND evalWaarde = 3 
    GROUP BY agclid 
    HAVING COUNT(DISTINCT agLkrid) = 3 
) 
) 

我也改变了第一GROUP BY的SELECT DISTINCT。

如果您正在寻找更高性能的解决方案,这将是没有帮助的。重写的SQL语句不会被更快地评估。