2009-02-24 60 views
1

警告:這裏是初學SQL!溫柔...難以結合JET SQL查詢

我有兩個查詢,以相當及時的方式獨立地給我我想從相關表中得到的東西,但是當我嘗試將這兩者結合成一個(富有感情的)聯合時,事情會很快下降到位而查詢要麼給我重複的記錄,要花很長時間才能運行,要麼拒絕運行我所引用的各種語法錯誤。

注意:我必須創建一個「虛擬」表(tblAllDates),其中包含2008年1月1日之後的日期,因爲我需要查詢從每天返回一條記錄,並且兩個表中都有幾天沒有數據。這是我能想出這樣做的唯一途徑,無疑有一種更聰明的辦法...

這裏有疑問:

SELECT tblAllDates.date, SUM(tblvolumedata.STT) 
FROM tblvolumedata RIGHT JOIN tblAllDates ON tblvolumedata.date=tblAllDates.date 
GROUP BY tblAllDates.date; 

SELECT tblAllDates.date, SUM(NZ(tblTimesheetData.batching)+NZ(tblTimesheetData.categorisation)+NZ(tblTimesheetData.CDT)+NZ(tblTimesheetData.CSI)+NZ(tblTimesheetData.destruction)+NZ(tblTimesheetData.extraction)+NZ(tblTimesheetData.indexing)+NZ(tblTimesheetData.mail)+NZ(tblTimesheetData.newlodgement)+NZ(tblTimesheetData.recordedDeliveries)+NZ(tblTimesheetData.retrieval)+NZ(tblTimesheetData.scanning)) AS VA 
FROM tblTimesheetData RIGHT JOIN tblAllDates ON tblTimesheetData.date=tblAllDates.date 
GROUP BY tblAllDates.date;

我成功的最好結果如下:

SELECT tblAllDates.date, 0 AS STT, SUM(NZ(tblTimesheetData.batching)+NZ(tblTimesheetData.categorisation)+NZ(tblTimesheetData.CDT)+NZ(tblTimesheetData.CSI)+NZ(tblTimesheetData.destruction)+NZ(tblTimesheetData.extraction)+NZ(tblTimesheetData.indexing)+NZ(tblTimesheetData.mail)+NZ(tblTimesheetData.newlodgement)+NZ(tblTimesheetData.recordedDeliveries)+NZ(tblTimesheetData.retrieval)+NZ(tblTimesheetData.scanning)) AS VA 
FROM tblTimesheetData RIGHT JOIN tblAllDates ON tblTimesheetData.date=tblAllDates.date 
GROUP BY tblAllDates.date 
UNION SELECT tblAllDates.date, SUM(tblvolumedata.STT) AS STT, 0 AS VA 
FROM tblvolumedata RIGHT JOIN tblAllDates ON tblvolumedata.date=tblAllDates.date 
GROUP BY tblAllDates.date; 

這給我我想要的VA和STT數據,但在兩個記錄在那裏我有數據來自於一個單一的一天,就像這樣:

date   STT  VA 
28/07/2008 0  54020 
28/07/2008 33812 0 
29/07/2008 0  53890 
29/07/2008 33289 0 
30/07/2008 0  51780 
30/07/2008 30456 0 
31/07/2008 0  52790 
31/07/2008 31305 0

我所追求的是每天單行STT和VA數據。這可能會如何實現,我可以從可以被認爲是最優的查詢中離開多遠? (不要笑,我只是想學習!)

回答

5

你可以把所有這一切到一個查詢像這樣

SELECT 
dates.date, 
SUM(volume.STT) AS STT, 
SUM(NZ(timesheet.batching)+NZ(timesheet.categorisation)+NZ(timesheet.CDT)+NZ(timesheet.CSI)+NZ(timesheet.destruction)+NZ(timesheet.extraction)+NZ(timesheet.indexing)+NZ(timesheet.mail)+NZ(timesheet.newlodgement)+NZ(timesheet.recordedDeliveries)+NZ(timesheet.retrieval)+NZ(timesheet.scanning)) AS VA 
FROM 
tblAllDates dates 
LEFT JOIN tblvolumedata volume 
ON dates.date = volume.date 
LEFT JOIN tblTimesheetData timesheet 
ON 
dates.date timesheet.date 
GROUP BY dates.date; 

我已經把日期表第一FROM子句中,然後LEFT JOIN編其他兩個表。

jet數據庫在查詢中可能有多個連接,所以你可能需要用圓括號包裝其中一個連接(我相信這被稱爲Bill的SQL!) - 我會推薦LEFT JOIN ing在查詢生成器表,然後取SQL代碼視圖和修改在SUM S,GROUP BY添加等

編輯:

確保每個表中的日期字段建立索引,你'加入這個領域的每個表。

編輯2:

這個怎麼樣 -

SELECT date, 
Sum(STT), 
Sum(VA) 
FROM 
(SELECT dates.date, 0 AS STT, SUM(NZ(tblTimesheetData.batching)+NZ(tblTimesheetData.categorisation)+NZ(tblTimesheetData.CDT)+NZ(tblTimesheetData.CSI)+NZ(tblTimesheetData.destruction)+NZ(tblTimesheetData.extraction)+NZ(tblTimesheetData.indexing)+NZ(tblTimesheetData.mail)+NZ(tblTimesheetData.newlodgement)+NZ(tblTimesheetData.recordedDeliveries)+NZ(tblTimesheetData.retrieval)+NZ(tblTimesheetData.scanning)) AS VA 
FROM tblTimesheetData RIGHT JOIN dates ON tblTimesheetData.date=dates.date 
GROUP BY dates.date 
UNION SELECT dates.date, SUM(tblvolumedata.STT) AS STT, 0 AS VA 
FROM tblvolumedata RIGHT JOIN dates ON tblvolumedata.date=dates.date 
GROUP BY dates.date 
) 
GROUP BY date; 

有趣的是,當我跑我的第一次發言反對一些測試數據,STT和VA的數字已全部乘以4,與第二種說法相比。非常奇怪的行爲,當然不是我所期望的。

0

日期表是最好的方法。

在那裏結合FROM子句。像這樣的東西....

SELECT d.date, 
    a.value, 
    b.value 
FROM tableOfDates d 
    RIGHT JOIN firstTable a 
    ON d.date = a.date 
    RIGHT JOIN secondTable b 
    ON d.date = b.date 
+0

謝謝,這適用於一個簡單的值(例如「a。掃描」),但返回「您試圖執行查詢,不包含指定的表達式'日期'作爲聚合函數的一部分」每當我嘗試使用其中一個SUM表達式。 – Lunatik 2009-02-24 13:50:59

+0

對不起,應該提到,只有當我將兩個連接都更改爲LEFT JOIN時,它才起作用,我不認爲這會給我需要的結果。使用RIGHT JOIN會提供「不支持的連接表達式」錯誤。我遇到過JET SQL限制嗎? – Lunatik 2009-02-24 13:57:52

0

將SQL轉換爲視圖,並加入他們的日期。

+0

謝謝,但似乎只能通過ADO訪問CREATE VIEW,這可能會幫助我在數據庫上粘貼前端時,但現在我只是使用Access的內置SQL窗口。 – Lunatik 2009-02-24 15:15:01