2012-12-11 34 views
0

我有一個SQL分貝MS訪問鏈接表查詢與LEFT JOIN和聚合函數不返回預期的結果

CreatedDate     QuoteNumber NumberOfLicensedDrivers 
2012-07-01 10:38:49.157 48641   0 
2012-07-01 18:35:38.680 48650   2 
2012-07-02 08:44:33.770 48670   1 
2012-07-02 09:12:09.447 48700   0 

我已經簡化查詢的運行時輸出以下結果的查詢這個帖子的緣故,但它基本上是:

SELECT DISTINCT 
     CreatedDate, 
     QuoteNumber, 
     count([DriversLicense]) as NumberOfLicensedDrivers 
FROM table1 LEFT OUTER JOIN table2 on table2.QuoteID = table1.ID 
WHERE CreatedDate > '7/1/2012' 
GROUP BY QuoteNumber, CreatedDate 
ORDER BY CreatedDate ASC 

該查詢給了我預期的輸出。我希望所有的引號出現在我的輸出中。如果有0個驅動程序,我想要顯示0。問題是我需要在鏈接表的MS訪問中創建相同的結果。 MS訪問輸出沒有給我預期的結果。

這裏是我使用的MS Access查詢

SELECT DISTINCT 
    quote.CreatedDate, 
    quote.QuoteNumber, 
    count(quoteDrivers.DriversLicense) As NumberOfLicensedDrivers 
FROM quote 
LEFT JOIN quoteDrivers ON quote.ID = quoteDrivers.QuoteID 
WHERE (quote.CreatedDate>#7/1/2012#) 
GROUP BY quote.CreatedDate, quote.QuoteNumber 
ORDER BY quote.CreatedDate; 

輸出顯示沒有許可的驅動程序:

CreatedDate   QuoteNumber NumberOfLicensedDrivers 
7/1/2012 10:38:49 AM 48641 0 
7/1/2012 6:35:39 PM 48650 0 
7/2/2012 8:44:34 AM 48670 0 
7/2/2012 9:12:09 AM 48700 0 

然而,當我添加一個額外的WHERE子句對quoteDrivers表:

SELECT DISTINCT 
    quote.CreatedDate, 
    quote.QuoteNumber, 
    count(quoteDrivers.DriversLicense) As NumberOfLicensedDrivers 
FROM quote 
LEFT JOIN quoteDrivers ON quote.ID = quoteDrivers.QuoteID 
WHERE (quote.CreatedDate>#7/1/2012#) 
and quoteDrivers.DriverAddedDate >#1/1/2012# ''Added this 
GROUP BY quote.CreatedDate, quote.QuoteNumber 
ORDER BY quote.CreatedDate; 

我得到預期的結果(減去0司機引號)

CreatedDate   QuoteNumber NumberOfLicensedDrivers 
7/1/2012 6:35:39 PM 48650   2 
7/2/2012 8:44:34 AM 48670   1 

任何人都可以解釋爲什麼我沒有得到司機的計數,而從在where子句中指定列quoteDrivers表?

+0

在quotedDrivers鏈接表中,在Access Design視圖中,CreatedDate是否顯示爲DateTime字段? –

+0

@rontornambe,yes both quoteDrivers.DriverAddedDate和quote.CreatedDate是設計視圖中的DateTime字段。然而,它們不是相同的日期,不能用作連接的一部分。 – james31rock

+0

如果鏈接表位於SQL Server中,是否可以運行SQL Profiler來查看Jet正在做什麼? – Laurence

回答

0

我的愚蠢抓住了我。我不知道爲什麼下面的查詢有效。

SELECT DISTINCT 
    quote.CreatedDate, 
    quote.QuoteNumber, 
    count(quoteDrivers.DriversLicense) As NumberOfLicensedDrivers 
FROM quote 
LEFT JOIN quoteDrivers ON quote.ID = quoteDrivers.QuoteID 
WHERE (quote.CreatedDate>#7/1/2012#) 
and quoteDrivers.DriverAddedDate >#1/1/2012# 
GROUP BY quote.CreatedDate, quote.QuoteNumber 
ORDER BY quote.CreatedDate; 

quoteDrivers.QuoteID是一個字符串,quote.ID是一個GUID。創建鏈接表時,MS訪問權限會在GUIDS附近添加括號{}。我不知道爲什麼查詢只在針對quoteDrivers表添加了where子句時才起作用。

以下查詢爲我提供了我所需要的。

SELECT DISTINCT 
    quote.CreatedDate, 
    quote.QuoteNumber, 
    count(quoteDrivers.DriversLicense) As NumberOfLicensedDrivers 
FROM quote 
LEFT JOIN quoteDrivers ON quote.ID = "{" + quoteDrivers.QuoteID + "}" 
WHERE (quote.CreatedDate>#7/1/2012#) 
GROUP BY quote.CreatedDate, quote.QuoteNumber 
ORDER BY quote.CreatedDate; 

我應該事先說明列結構,所以抱歉不這樣做。如果有人可以解釋爲什麼我的聯接工作,當我添加一個where子句針對quoteDrivers表("and quoteDrivers.DriverAddedDate >#1/1/2012#")我真的很感激它。

1

不知道訪問是否支持這一點,但在一般的SQL,移動標準上的條款中加入將讓查詢的「外」的部分工作

Select 
    quote.CreatedDate, 
    quote.QuoteNumber, 
    count(quoteDrivers.DriversLicense) As NumberOfLicensedDrivers 
From 
    quote 
    Left Join 
    quoteDrivers 
    On quote.ID = quoteDrivers.QuoteID And quoteDrivers.DriverAddedDate > #1/1/2012# 
Where 
    quote.CreatedDate > #7/1/2012# 
Group By 
    quote.CreatedDate, 
    quote.QuoteNumber 
Order By 
    quote.CreatedDate; 

而且,你的不同是多餘的與這個組合在一起。可能優化器足夠聰明,不會變慢,但爲什麼要抓住機會!

+0

我不相信Access允許向Join的ON子句添加條件語句(如quoteDrivers.DriverAddedDate>#1/1/2012#)。 –

+0

感謝@勞力士,但我試圖遠離添加'和quoteDrivers.DriverAddedDate>#1/2012/2012#'完全。我試過了你的查詢,它給了我和我在下面列出的查詢一樣的結果「這裏是我用於MS ACCESS的查詢」 – james31rock

1

一個特定的問題:您可以在封裝了連接服務器端的sql server上創建一個視圖,然後在Access中鏈接到該視圖作爲鏈接表。 此外,檢查日期變量的邏輯,嘗試用DateDiff函數替換它,以避免與硬編碼的日期文字根據本地設置

被不同的解釋問題
+0

謝謝@Chris。我會的,但我不能。我想最初創建一個視圖,並鏈接到該視圖。爲了在sql server中創建查詢,我必須添加一個鏈接服務器(我給出的查詢更簡單)。我們擁有衆多的開發,質量和生產數據庫環境。我們有一個VS 2010 DB項目被部署到這些不同的環境中。爲了創建視圖,我必須有條件地向dev,qa或prod添加鏈接的服務器,具體取決於我要部署的env。我還必須根據部署環境更改視圖選擇語句。 – james31rock

1

我建議重新編寫查詢,如下所示:

SELECT CreatedDate, QuoteNumber, Count(*) as NumberOfLicensedDrivers 
FROM (
    SELECT q.CreatedDate, q.QuoteNumber, qd.DriversLicense 
    FROM quote q INNER JOIN quoteDrivers qd ON q.ID = qd.QuoteID 
    WHERE q.CreatedDate > #7/1/2012# 
) X 
GROUP BY CreatedDate, QuoteNumber 
ORDER BY 1 

通過組合子查詢中的表格,然後從中獲取驅動程序的計數,查詢表單適合MS SQL服務器SQL和MS Jet SQL(MS訪問SQL)的規則集,因此, ms訪問做「錯誤的」,因此結果集應該是相同的。

我只是真的不確定dateformat#..#;在SQL中,這通常是'..';如果後端是另一個MS Access數據庫,格式#..#將是強制性的,但是鑑於它是sql,'..'可能會更好 - 雖然我不能說某些非正式的,所以你可能想測試這個。

希望這有助於:-)

+0

謝謝,但該查詢只給我帶引號驅動程序的引號。如果我使用相同的查詢執行LEFT JOIN,即使許可驅動程序的數量爲0,它也會給予我1作爲NumerOfLicensedDrivers。此外,該查詢與標題爲「這是我用於MS ACCESS的查詢」的標題相同。連接工作的唯一方法是,如果我在quoteDrivers表中添加WHERE子句。 – james31rock