【问题标题】:Having difficulty combining JET SQL queries难以组合 JET SQL 查询
【发布时间】:2009-02-24 13:12:01
【问题描述】:

警告:这里是初学者 SQL!温柔点……

我有两个查询以合理及时的方式从相关表中独立地给我我想要的东西,但是当我尝试将这两者组合成一个(丑陋的)联合时,事情很快就化为乌有,查询要么给了我重复记录,运行时间过长,或根本拒绝运行,引用我的各种语法错误。

注意:我必须创建一个“虚拟”表 (tblAllDates),其中包含一个包含 2008 年 1 月 1 日的日期的字段,因为我需要查询从每天返回一条记录,并且两个表中都有天没有数据。这是我能想到的唯一方法,毫无疑问还有更聪明的方法......

这里是查询:

选择 tblAllDates.date, SUM(tblvolumedata.STT)
FROM tblvolumedata RIGHT JOIN tblAllDates ON tblvolumedata.date=tblAllDates.date
按 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
按 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
按 tblAllDates.date 分组
UNION SELECT tblAllDates.date, SUM(tblvolumedata.STT) AS STT, 0 AS VA
FROM tblvolumedata RIGHT JOIN tblAllDates ON tblvolumedata.date=tblAllDates.date
按 tblAllDates.date 分组;

这为我提供了我想要的 VA 和 STT 数据,但在两条记录中,我在一天内同时拥有来自两者的数据,如下所示:

日期 STT VA
2008 年 7 月 28 日 0 54020
2008 年 7 月 28 日 33812 0
2008 年 7 月 29 日 0 53890
2008 年 7 月 29 日 33289 0
2008 年 7 月 30 日 0 51780
30/07/2008 30456 0
2008 年 7 月 31 日 0 52790
31/07/2008 31305 0

我要的是每天单行的 STT 和 VA 数据。这是如何实现的,我离一个可以被认为是最优的查询还有多远? (别笑,我只求学!)

【问题讨论】:

    标签: sql ms-access jet


    【解决方案1】:

    您可以像这样将所有这些放入一个查询中

    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 JOINed 放在另外两个表中。

    jet 数据库在一个查询中有多个连接可能会很有趣,因此您可能需要将其中一个连接括在括号中(我相信这被称为比尔的 SQL!) - 我会推荐 LEFT JOINing查询生成器中的表,然后获取 SQL 代码视图并对其进行修改以添加到 SUMs、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。非常奇怪的行为,当然不是我所期望的。

    【讨论】:

    • 谢谢,有点括号让这一切顺利进行。但是,我想我之前已经编造了类似的东西,这个查询是似乎让 Access 陷入困境的查询之一。
    • 您是否为 3 个表格中的每个表格的日期字段编制了索引?
    • 我没有,但现在有,不幸的是它并没有加快速度,我仍然需要 CTRL+BREAK 退出查询
    • 您运行它的日期有多少?您是否尝试过运行它并将其限制在一个日期范围内并查看需要多长时间?
    • 我估计花费在汇总每个表中的值并对每个值执行 NZ 函数所花费的时间最长。
    【解决方案2】:

    日期表是最好的方法。

    在 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
    

    【讨论】:

    • 谢谢,这适用于简单值(例如“a.scanning”),但返回“您尝试执行的查询不包含指定表达式'date'作为聚合函数的一部分" 每当我尝试使用 SUM 表达式之一时。
    • 对不起,应该提到这仅在我将两个联接都更改为 LEFT JOIN 时才有效,我认为这不会给我所需的结果。使用 RIGHT JOIN 会出现“不支持连接表达式”错误。我遇到了 JET SQL 限制吗?
    【解决方案3】:

    将 SQL 转换为视图并在日期上加入它们。

    【讨论】:

    • 谢谢,但 CREATE VIEW 似乎只能通过 ADO 访问,当我在数据库上粘贴前端时这可能会有所帮助,但现在我只是使用 Access 的内置 SQL 窗口.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多