2015-11-19 99 views
0

我一直在用SQL处理Access数据库。我试图执行以下查询:查询SQL Microsoft Access错误?

SELECT Produtos.produto, 
     [aux].[total]/[Produtos].[existencias] AS [peso consumos nas existencias] 
FROM (SELECT Produtos.produto, SUM(Consumos.quantidade) AS total 
     FROM Consumos, Produtos, Fornecedores 
     WHERE Consumos.codproduto=Produtos.produto 
     AND Produtos.codfornecedor=9 
     GROUP BY Produtos.produto 
     ORDER BY Produtos.produto) AS aux 
INNER JOIN Produtos 
    ON aux.produto = Produtos.produto 
WHERE (((aux.produto)=[Produtos].[produto])); 

的结果仔细一看向我表明列[比索consumos NAS existencias]乘以10,试图解决这一问题后,我发现,我是不是使用该表Fornecedores虽然我打电话后,从关键字,所以我删除它:

SELECT Produtos.produto, 
     [aux].[total]/[Produtos].[existencias] AS [peso consumos nas existencias] 
FROM (SELECT Produtos.produto, SUM(Consumos.quantidade) AS total 
     FROM Consumos, Produtos 
     WHERE Consumos.codproduto=Produtos.produto 
     AND Produtos.codfornecedor=9 
     GROUP BY Produtos.produto 
     ORDER BY Produtos.produto) AS aux 
INNER JOIN Produtos 
    ON aux.produto = Produtos.produto 
WHERE (((aux.produto)=[Produtos].[produto])); 

运行后,结果是正确的。这是否会发生?如果是这样,为什么?

谢谢!

+1

是的,它应该发生。通过包含Fornecedores并且不指定连接条件,您可以有效地询问外部连接或获取每一行,从而返回多个结果。如果你只查看内部查询,你可能会看到第一个sql中的行数是第二个sql的10倍。 –

回答

0

您的Fornecedores表可能有10条记录。

FROM Consumos, Produtos, Fornecedores 
WHERE Consumos.codproduto=Produtos.produto 

在做一个笛卡尔乘积的Consumos-Produtos的加入与这些10个记录,所以SUM()中使用的每个数的10倍。


注1:
它被认为是更好的风格是使用显式INNER JOIN语法:

FROM Consumos INNER JOIN Produtos 
     ON Consumos.codproduto=Produtos.produto 
    WHERE Produtos.codfornecedor=9 

,而不是FROM Consumos, Produtos

注2:
如果你认为你已经找到Access(或任何数据库)查询引擎中的一个错误,几乎可以100%地发现该错误在您的查询中。 ;-)