首页 > 解决方案 > 如何提高子查询的性能?

问题描述

我有以下两个单独的查询:

SELECT qry_tbl_G_ov_uni_atp.ID, Max(qry_tbl_G_ov_uni_atp.nElo_Ov) AS MaxOfnElo_Ov
FROM qry_tbl_G_ov_uni_atp
GROUP BY qry_tbl_G_ov_uni_atp.ID;

和:

SELECT qry_tbl_G_ov_uni_atp.ID, Max(qry_tbl_G_ov_uni_atp.nElo_Sur) AS MaxOfnElo_Sur1
FROM qry_tbl_G_ov_uni_atp
WHERE qry_tbl_G_ov_uni_atp.ID_C = 1
GROUP BY qry_tbl_G_ov_uni_atp.ID;

两者都运行良好,在一两秒钟内。我想将它们组合成一个查询,所以我有ID,MaxOfnElo_Ov并且MaxOfnElo_Sur1在同一个输出中。

我知道我需要使用子查询,但我的尝试绝对需要很长时间才能显示任何内容,然后几乎无法使用,因为任何滚动锁定的尝试都会再次访问一段时间。我显然没有做正确的事情。这是我的子查询代码:

SELECT qry_tbl_G_ov_uni_atp.ID, Max(qry_tbl_G_ov_uni_atp.nElo_Ov) AS MaxOfnElo_Ov, (SELECT Max(tt.nElo_Sur)
FROM qry_tbl_G_ov_uni_atp as tt
WHERE tt.ID_C = 1
AND tt.ID = qry_tbl_G_ov_uni_atp.ID) AS MaxOfnElo_Sur1
FROM qry_tbl_G_ov_uni_atp
GROUP BY qry_tbl_G_ov_uni_atp.ID;

标签: ms-access

解决方案


如您所指出的,您可以使用子查询来实现此目的。通过在 中使用子查询,JOIN您将获得(您的第一个查询)的所有结果和(您的第二个查询)的a匹配结果b

SELECT  a.ID,
        a.MaxOfnElo_Ov,
        b.MaxOfnElo_Sur1
  FROM  (
        SELECT  qry_tbl_G_ov_uni_atp.ID,
                Max(qry_tbl_G_ov_uni_atp.nElo_Ov) AS MaxOfnElo_Ov
          FROM  qry_tbl_G_ov_uni_atp
          GROUP BY qry_tbl_G_ov_uni_atp.ID
        ) a
    LEFT JOIN (
              SELECT  qry_tbl_G_ov_uni_atp.ID,
                      Max(qry_tbl_G_ov_uni_atp.nElo_Sur) AS MaxOfnElo_Sur1
                FROM  qry_tbl_G_ov_uni_atp
                WHERE qry_tbl_G_ov_uni_atp.ID_C = 1
                GROUP BY qry_tbl_G_ov_uni_atp.ID
              ) b ON b.ID = a.ID

请注意,这是未经测试的,并假设ID两者ab(我相信它是)相同。


推荐阅读