【问题标题】:SQL query causes Microsoft Access to hangSQL 查询导致 Microsoft Access 挂起
【发布时间】:2012-12-19 11:15:06
【问题描述】:

以下是我在Microsoft Access中的sql。我想根据子查询选择数据。

单独运行子查询就可以了。它将在 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] 

【问题讨论】:

  • 子查询通常很慢,结合嵌套子选择和联合,我们可能已经找到了你的问题^_^。您是否可以发布带有少量示例数据的表结构并说明您需要什么,因为我们可以简化此查询?

标签: sql ms-access subquery


【解决方案1】:

试试这个,在 MS Access 中,显式 JOIN 会快很多

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] 

【讨论】:

  • 正如@Ben 所说,我认为这是一个有趣的答案“索引......”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多