0

我有一个查询,在 SQL db 上运行时输出以下结果

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

但是,当我对 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#)
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

谁能解释为什么我没有在 quoteDrivers 表的 where 子句中指定列的情况下没有得到驱动程序的数量?

4

4 回答 4

1

不确定 Access 是否支持这一点,但在一般 SQL 中,将条件移动到 join 中的 on 子句将使查询的“外部”部分保持工作

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;

另外,你的 distinct 对这个 group by 来说是多余的。可能优化器足够聪明,不会变慢,但为什么要冒险!

于 2012-12-11T21:00:39.480 回答
1

一个确定的解决方法:您可以在封装连接服务器端的 sql 服务器上创建一个视图,然后在 Access 中将视图作为链接表链接到该视图。还要检查日期变量逻辑,尝试用 DateDiff 函数替换它,以避免硬编码日期文字根据本地设置被不同解释的问题

于 2012-12-11T21:07:02.597 回答
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 server SQL 和 MS Jet SQL(MS access SQL)的规则集,因此 ms 访问的范围较小做“错误的事情”,结果集应该是相同的。

我只是不确定日期格式#..#; 在 SQL 中,这通常是 '..';如果后端是另一个 ms 访问数据库,则格式 #..# 将是强制性的,但鉴于它是 sql,'..' 可能会更好 - 虽然我不能肯定地说,所以你可能想测试一下。

希望这可以帮助 :-)

于 2012-12-12T03:55:25.630 回答
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;

我应该事先解释一下列结构,很抱歉没有这样做。如果有人能解释为什么当我在 quoteDrivers 表中添加 where 子句时我的 join 有效,("and quoteDrivers.DriverAddedDate >#1/1/2012#")我将不胜感激。

于 2012-12-12T14:15:00.137 回答