2013-02-12 2 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

답변

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

나는 또한 SELECT DISTINCT에 의해 첫 번째 그룹을 변경했습니다.

성능이 우수한 솔루션을 찾고 있다면 도움이되지 않을 것입니다. 다시 작성된 SQL 문은 더 빨리 평가되지 않습니다.

관련 문제