0

我有四个访问表。

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

都有一个名为 JobNumber 的连接列。我已经对两个日期之间的 Invoices 进行了查询,以创建 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 的所有成本的总和。欢迎任何指点。

4

1 回答 1

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

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

于 2013-10-12T12:20:27.600 回答