2013-10-12 65 views
0

我有四個Access表。Microsoft 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; 

我更習慣於使用SQL Server和MySQL與PHP,其中使用臨時表和多行SQL的下一步將是微不足道的。但Access Query設計器不允許這樣的事情。所以我不確定如何在Access中的4個表中設計查詢。我現在想爲PO1做PO3:

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

然後返回該JobNumber的所有成本的總和。 歡迎任何指針。

+0

不確定Access查詢設計器不支持多個表的含義 - 請在工具欄/功能區或上下文菜單中查找「顯示錶」命令。也就是說,如果你很高興直接寫SQL,爲什麼不直接寫這些呢? (在界面中查找「SQL視圖」,例如再次通過上下文菜單。) –

回答

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 

這是一種像使用臨時表,但查詢優化器如果可以找到更高效的技術,就可以免費使用。

+0

感謝上百萬的勞倫斯。我不習慣在一行SQL中做所有事情。 –