2012-12-19 176 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

而@Ben在我認爲是一個有趣的答案「索引...」 – Fionnuala

+0

謝謝。 SQL的作品。 –