2012-12-19 3 views
0

다음은 Microsoft Access에서 사용하는 sql 파일입니다. 하위 쿼리를 기반으로 데이터를 선택하고 싶습니다.SQL 쿼리로 인해 Microsoft Access가 중지된다

하위 쿼리를 별도로 실행하는 것이 좋습니다. 30 초 이내에 결과를 반환합니다. 하지만 다음 SQL을 모두 실행하면 ms 액세스의 응답이 없습니다. 쿼리를 실행하는 것이 바쁠 것 같지만 결과가 반환되지 않습니다.

SELECT '2012/8'  AS [Period], 
     monthno, 
     [cluster], 
     'Transfer in' AS Remark, 
     Count(*)  AS [number], 
     '4'   AS [sorting] 
FROM [2012], 
     namesort 
WHERE monthno = 244 
     AND (div <> 'XXX' 
       OR div IS NULL) 
     AND hc = 1 
     AND [2012].post = namesort.post 
     AND monthno BETWEEN namesort.monthno_start AND namesort.monthno_end 
     AND [2012].term <> 'Temporary' 
     AND empid IN (SELECT empid 
        FROM (SELECT empid, 
            [cluster], 
            Count(*) AS [empid no] 
          FROM (SELECT empid, 
              cluster 
            FROM [assignment] 
              INNER JOIN yearmonth 
                ON [assignment].[year month] 
                 = 
                 yearmonth.[year month] 
            WHERE yearmonth.[monthno] = 243 
              AND [assignment].hc = 1 
              AND [assignment].term <> 'Temporary' 
            UNION 
            SELECT empid, 
              [cluster] 
            FROM [2012] 
            WHERE monthno = 244 
              AND [2012].term <> 'Temporary' 
              AND (div <> 'XXX' 
                OR div IS NULL) 
              AND hc = 1) 
          GROUP BY [empid], 
             [cluster] 
          HAVING Count(*) = 1) 
        GROUP BY empid 
        HAVING Count(*) > 1) 
GROUP BY monthno, 
      [cluster] 
+0

훨씬 빨리^_^. 소량의 샘플 데이터와이 쿼리를 간소화 할 수있는 필요한 것에 대한 설명으로 테이블 구조를 게시 할 수 있습니까? –

답변

1

할 명시 적 조인, MS Access에서이 작업을 할 수보십시오 하위 쿼리는 일반적으로 매우 느린 중첩 된 부속 선택과 조합에 있음을 결합하여 우리가 문제를 발견 할 수 있습니다

SELECT '2012/8'  AS [Period], 
     monthno, 
     [cluster], 
     'Transfer in' AS Remark, 
     Count(*)  AS [number], 
     '4'   AS [sorting] 
FROM ([2012] 
INNER JOIN namesort 
ON [2012].post = namesort.post) 
INNER JOIN 
     (SELECT empid 
        FROM (SELECT empid, 
            [cluster], 
            Count(*) AS [empid no] 
          FROM (SELECT empid, 
              cluster 
            FROM [assignment] 
              INNER JOIN yearmonth 
                ON [assignment].[year month] 
                 = 
                 yearmonth.[year month] 
            WHERE yearmonth.[monthno] = 243 
              AND [assignment].hc = 1 
              AND [assignment].term <> 'Temporary' 
            UNION 
            SELECT empid, 
              [cluster] 
            FROM [2012] 
            WHERE monthno = 244 
              AND [2012].term <> 'Temporary' 
              AND (div <> 'XXX' 
                OR div IS NULL) 
              AND hc = 1) 
          GROUP BY [empid], 
             [cluster] 
          HAVING Count(*) = 1) 
        GROUP BY empid 
        HAVING Count(*) > 1) As Emps 
ON [2012].EmpID = Emps.EmpID 
WHERE monthno = 244 
     AND (div <> 'XXX' 
       OR div IS NULL) 
     AND hc = 1 

     AND monthno BETWEEN namesort.monthno_start AND namesort.monthno_end 
     AND [2012].term <> 'Temporary' 

GROUP BY monthno, 
      [cluster] 
+0

그리고 @ 벤은 내가 생각했던 것 중 재미있는 대답은 "색인 ..."이라고 말했습니다. – Fionnuala

+0

감사합니다. SQL은 작동합니다. –

관련 문제