【问题标题】:Combine an append query with regular queries in MS Access将附加查询与 MS Access 中的常规查询相结合
【发布时间】:2015-02-12 09:54:45
【问题描述】:

我有以下 3 个查询。第一个从数据总量中取出相关数据:

SELECT 
    (n()-1)*[Forms]![f_Main]![PowerBinCombo] & ' - ' & n()*[Forms]![f_Main]![PowerBinCombo] & " kW" AS Bin, 
    q_DataLimited.POW001, 
    q_DataLimited.WSP001, 
    q_DataLimited.POW002, 
    q_DataLimited.WSP002
FROM q_DataLimited
WHERE 
    (
        ((q_DataLimited.POW001)>(n()-1)*[Forms]![f_Main]![PowerBinCombo] 
            And (q_DataLimited.POW001)<n()*[Forms]![f_Main]![PowerBinCombo]
        )
        AND (([Forms]![f_Main]![BinOnTurbine])='Reference Turbine') 
        AND ((q_DataLimited.[VG's])='Without')
    ) 
    OR 
    (
        (
            (q_DataLimited.POW002)>(n()-1)*[Forms]![f_Main]![PowerBinCombo] 
                And (q_DataLimited.POW002)<n()*[Forms]![f_Main]![PowerBinCombo]
        ) 
        AND (([Forms]![f_Main]![BinOnTurbine])='Power Curve Upgraded Turbine') 
        AND ((q_DataLimited.[VG's])='Without')
    );

以及计算平均值和标准差的查询:

SELECT q_PowerBinned.Bin, Avg(q_PowerBinned.POW001) AS AvgOfPOW001, StDev(q_PowerBinned.POW001) AS StDevOfPOW001, Avg(q_PowerBinned.WSP001) AS AvgOfWSP001, StDev(q_PowerBinned.WSP001) AS StDevOfWSP001, Avg(q_PowerBinned.POW002) AS AvgOfPOW002, StDev(q_PowerBinned.POW002) AS StDevOfPOW002, Avg(q_PowerBinned.WSP002) AS AvgOfWSP002, StDev(q_PowerBinned.WSP002) AS StDevOfWSP002, Count(q_PowerBinned.Bin) AS CountOfBin
FROM q_PowerBinned
GROUP BY q_PowerBinned.Bin;

我想将值移动到表格中。为此,我在 Access 中使用附加查询。 SQL 看起来像:

INSERT INTO t_Average_Stored ( Bin, PowAvg001, WindAvg001, PowAvg002, WindAvg002, n_samples, PowDev001, WindDev001, PowDev002, WindDev002 )
SELECT q_Average_Temp.Bin, q_Average_Temp.AvgOfPOW001, q_Average_Temp.AvgOfWSP001, q_Average_Temp.AvgOfPOW002, q_Average_Temp.AvgOfWSP002, q_Average_Temp.CountOfBin, q_Average_Temp.StDevOfPOW001, q_Average_Temp.StDevOfWSP001, q_Average_Temp.StDevOfPOW002, q_Average_Temp.StDevOfWSP002
FROM q_Average_Temp;

它是如何组合成一个 SQL 的?

我的 SQL 还不强,所以我很难结合一些查询来优化它们。我希望能简要说明答案背后的原因,以便将其应用于其他类似的 SQL 语句。

提前谢谢你。

埃米尔。

这可以更智能/更快地完成吗?

我使用它的示例:

【问题讨论】:

  • 为什么需要这个?第三个表显然违反了规范化规则,使用列而不是行。通过存储计算值也忽略了数据库设计的基础。为什么你必须这样做?除此之外,为什么要使用子查询?在我看来,以上应该更有效。
  • 1) 我使用“我的”软件的经验表明,尽管查询中有操作,但实际的 openquery 需要时间。因此,我想尝试尽可能多地合并为一个,因为我不在那里使用中间值。这是一个动作,分三步。可以这么说,我希望它是 1 步中的 1 个动作。 2)我存储值,因为它是对数据的分析。我计算不同范围内的不同事物并存储它们以便能够对其进行可视化绘图以及一些我需要这些值的计算。 3)请详细说明您所说的违反规则是什么意思? :)
  • 为了记录,该程序应该更多地被视为一个分析工具,而不是一个数据库,访问是好的。问题是随着我内置更多功能,它变得非常慢。我已经从该工具中添加了一份报告 (PDF),因此您可以查看它的计算示例,以便于理解。
  • 我无法编辑我的回复,但我上传了一些我用我存储的表格制作的一些图表的图片。(没有 pdf)
  • @PaulFrancis 数据的非规范化和计算值的存储并不总是自动“错误”。我一直在关注埃米尔最近提出的一些问题,我同意他在他的具体案例中试图做的事情。这两件事都不应该粗心大意,但出于实际原因 - 特别是在性能方面 - 它们有时是必要的。

标签: sql ms-access


【解决方案1】:

将多个 SQL 语句组合成一个“大型查询”需要使用子查询,例如

SELECT subquery.Column1, AVG(subquery.Column2) AS AvgOfColumn2 ... 
FROM
    (
        SELECT Column1, Column2, ...
        FROM tablename
        WHERE ...
    ) AS subquery
GROUP BY subquery.Column1

但是,如果您已经将子查询存储为 Access 中保存的 Query 对象,那么我怀疑将外部查询重写为

INSERT INTO newtable ( Column1, ... )
SELECT statsquery.Column1, ...
FROM
    (
        SELECT subquery.Column1, AVG(subquery.Column2) AS AvgOfColumn2 ... 
        FROM
            (
                SELECT Column1, Column2, ...
                FROM tablename
                WHERE ...
            ) AS subquery
        GROUP BY subquery.Column1
    ) AS statsquery

确实会给您带来很大的性能提升。处理数字所涉及的工作可能比解析 SQL 代码花费更多的时间,无论该代码来自一个大型复合查询还是几个已保存的 QueryDef 对象。

【讨论】:

  • 嗨,戈德。再次感谢您的宝贵时间。好吧,在我看来,这是降低计算速度的唯一选择,因为查询的数量不能最小化。但是,您在 SQL 中是否有一些通用的“礼貌”可能使我的查询运行得更快?我认为清理表格会导致时间问题,但是当我调试时证明是非常快的。主要的是实际查询。例如,您在上面看到的 3 总共需要 30 秒左右才能更新。我更新的方式是docmd.open“查询”,然后是docmd.close。有没有更聪明的方法?
  • @EmilOlsen 您可以尝试一件事:创建一个名为 [t_PowerBinned] 的表来保存您的第一个查询的结果,并确保 [bin] 列上有一个非唯一索引。让您的第一个(“选择相关行”)查询 INSERT INTO [t_PowerBinned],并让您的第二个(“stats”)查询针对 [t_PowerBinned] 而不是 [q_PowerBinned] 运行。然后像往常一样运行第三个查询。 [t_PowerBinned] 表可能会加快速度,因为 [bin] 列 (1) 将是静态文本而不是表达式,并且 (2) 它将有一个索引。
  • 很好的建议,我现在就试试,让你知道任何进展!
  • 似乎将“管理”查询移动到一个表中,然后每次使用该表,速度提高了 10 倍! Ty Gord,风云人物。
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 2012-06-16
  • 2015-09-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
相关资源
最近更新 更多