Microsoft Access中的多表查询

时间:2013-10-12 11:38:02

标签: sql ms-access

我有四个访问表。

Invoices (Date, JobNumber)
PO1 (Cost, JobNumber)
PO2 (Cost, JobNumber)
PO3 (Cost, JobNumber)

所有人都有一个名为JobNumber的连接列。 我已经在两个日期之间对发票进行查询,以创建一个JobNumbers表。

SELECT JobNumber FROM Invoices WHERE (Date > "startDate") AND (Date < "endDate") INTO tempTable;

我更习惯使用PHP的SQL Server和mySQL,其中接下来的步骤使用临时表和多行SQL是微不足道的。但Access Query设计器不允许这样的事情。所以我不确定如何在Access中的4个表中设计查询。我现在想要PO1到PO3:

SELECT SUM(PO1.Price) AS TotalPrice FROM P01,tempTable WHERE PO1.JobNumber=tempTable.JobNumber; 

然后返回该JobNumber的所有成本的总和。 欢迎任何指示。

1 个答案:

答案 0 :(得分:4)

SQL内置了连接方式,在这种情况下,您不需要使用临时表。如果您进入设计查询然后选择SQL视图,则以下查询应生成超过PO1,PO2和PO3的总计。

Select
    i.JobNumber,
    Sum(c.Cost) as TotalCost
From
    Invoices as i
        Left Outer Join (
            Select
                Cost,
                JobNumber
            From
                PO1
            Union All
            Select
                Cost,
                JobNumber
            From
                PO2
            Union All
            Select
                Cost,
                JobNumber
            From
                PO3
        ) as c
        On i.JobNumber = c.jobNumber
Where
    i.Date >= #StartDate# And
    i.Date < #EndDate#
Group By
    i.JobNumber

这里有很多活动部件。您可以做的第一件事就是为内部选择创建单独的查询。因此,创建一个名为AllPO的查询,其定义如下:

Select
    Cost,
    JobNumber
From
    PO1
Union All
Select
    Cost,
    JobNumber
From
    PO2
Union All
Select
    Cost,
    JobNumber
From
    PO3

然后您可以将第一个查询重新定义为

Select
    i.JobNumber,
    Sum(c.Cost) as TotalCost
From
    Invoices as i
        Left Outer Join
    AllPO as c
        On i.JobNumber = c.jobNumber
Where
    i.Date >= #StartDate# And
    i.Date < #EndDate#
Group By
    i.JobNumber

这有点像使用临时表,除非查询优化器可以使用更有效的技术,如果它可以找到一个。