为什么我的SQL MsAccess查询这么慢?

时间:2016-07-03 18:22:18

标签: sql database ms-access

基本上我有一个SQL查询,它是10个查询的联合,如下所示。为什么这个查询这么慢?运行时间超过一分钟,当我在此查询中使用带有DCount的文本框时,它会崩溃我的表单。

SELECT
ESP_Fisico.ESP_SubTipo_ID,
ESP_Fisico.ESP_Unidade_ID,
ESP_Facturacao.Item_TAG,
MIN(ESP_Facturacao.[1a_MesAno]) AS Data,
MIN(ESP_Facturacao.[1a_Faturado]) AS Valor,
'1 a' AS Tarefa,
'1' AS Control,
min(ESP_Administrativas.Novo_Pos_2010),
min(ESP_SubTipo.Descrição) AS SubTipo,
min(ESP_Unidade.Descricao) AS Unidade,
min(ESP_Facturacao.ID)
FROM ESP_Unidade INNER JOIN (((ESP_TAG LEFT JOIN ESP_Facturacao ON ESP_TAG.ID = ESP_Facturacao.ESP_Tag_ID) INNER JOIN (ESP_SubTipo INNER JOIN ESP_Fisico ON ESP_SubTipo.ID = ESP_Fisico.ESP_SubTipo_ID) ON ESP_TAG.ID = ESP_Fisico.ESP_Tag_ID) INNER JOIN ESP_Administrativas ON ESP_TAG.ID = ESP_Administrativas.ESP_Tag_ID) ON ESP_Unidade.ID = ESP_Fisico.ESP_Unidade_ID
WHERE (((ESP_Facturacao.Item_TAG) Not In
(SELECT ESP_Facturacao.Item_TAG
FROM ESP_Facturacao
WHERE (((ESP_Facturacao.[1a_MesAno]) Is Not Null))))
AND ((ESP_Administrativas.Data_Aut_Funcion) Is Null))
Group By ESP_Facturacao.Item_TAG, ESP_Fisico.ESP_SubTipo_ID, ESP_Fisico.ESP_Unidade_ID, ESP_Facturacao.Item_TAG

1 个答案:

答案 0 :(得分:1)

您已经从ESP_Facturacao中选择数据,再次查询同一个表,以便以低效的方式在Access中实现Where子句(与大多数其他RDBMS中一样)。您应该在内部查询的表名称上创建 alias SELECT AA.Item_TAG FROM ESP_Facturacao As AA WHERE (((AA.[1a_MesAno]) Is Not Null))

SELECT
ESP_Fisico.ESP_SubTipo_ID,
ESP_Fisico.ESP_Unidade_ID,
ESP_Facturacao.Item_TAG,
MIN(ESP_Facturacao.[1a_MesAno]) AS Data,
MIN(ESP_Facturacao.[1a_Faturado]) AS Valor,
'1 a' AS Tarefa,
'1' AS Control,
min(ESP_Administrativas.Novo_Pos_2010),
min(ESP_SubTipo.Descrição) AS SubTipo,
min(ESP_Unidade.Descricao) AS Unidade,
min(ESP_Facturacao.ID)
FROM ESP_Unidade INNER JOIN (((ESP_TAG LEFT JOIN ESP_Facturacao ON ESP_TAG.ID = ESP_Facturacao.ESP_Tag_ID) INNER JOIN (ESP_SubTipo INNER JOIN ESP_Fisico ON ESP_SubTipo.ID = ESP_Fisico.ESP_SubTipo_ID) ON ESP_TAG.ID = ESP_Fisico.ESP_Tag_ID) INNER JOIN ESP_Administrativas ON ESP_TAG.ID = ESP_Administrativas.ESP_Tag_ID) ON ESP_Unidade.ID = ESP_Fisico.ESP_Unidade_ID
WHERE (((ESP_Facturacao.Item_TAG) Not In
(SELECT AA.Item_TAG FROM ESP_Facturacao As AA 
WHERE (((AA.[1a_MesAno]) Is Not Null))))
AND ((ESP_Administrativas.Data_Aut_Funcion) Is Null))
Group By ESP_Facturacao.Item_TAG, ESP_Fisico.ESP_SubTipo_ID, ESP_Fisico.ESP_Unidade_ID, ESP_Facturacao.Item_TAG