如何获得别名表中的最小值和最大值,以便在between子句中使用?

vq8itlhq  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(356)

结果表:(pk=id)

统计表:(pk=id,外键=test\u id)

我的问题:

SELECT *
FROM (
        (SELECT *
         FROM results
         WHERE job_id=2000) AS res
      LEFT JOIN
        (SELECT *
         FROM STATISTICS
         WHERE RESULT='FAILED') AS stat ON res.id=stat.results_id BETWEEN X AND Y)

results.idMap到statistics.test\u id。在x和y处,我想使用alias表中的min和max id值 res (即第一行和最后一行的ID job_id=2000 . 原因是统计数据包含非常多的行,因为结果中的每一行对应多个行,但我只关心与子集中的测试对应的那些行 job_id=2000 . 上面的查询在没有between语句的情况下工作,但是由于尝试连接统计信息的全部内容,而实际应用的行只有一小部分(如果我硬编码x和y,查询时间是~120秒,而不是~2秒),因此变得非常慢。
有没有办法从alias表中获取x和y值并在between语句中使用?

zengzsys

zengzsys1#

如果要提高性能,请不要使用子查询:

SELECT *
FROM results r LEFT JOIN
     STATISTICS s
     ON r.id = s.results_id AND s.RESULT = 'FAILED'
WHERE r.job_id = 2000;

为了提高性能,您需要索引: results(job_id, id) (尽管 results(job_id) (已足够) statistics(results_id, result) (尽管 statistics(results_id) (已足够)

vc9ivgsu

vc9ivgsu2#

可以按如下方式使用聚合函数:

SELECT *
FROM (
        (SELECT MIN(ID) AS MINID, MAX(ID) AS MAXID, JOB_ID
         FROM results
         WHERE job_id=2000
         GROUP BY JOB_ID) AS res
      LEFT JOIN
        (SELECT *
         FROM STATISTICS
         WHERE RESULT='FAILED') AS stat ON stat.results_id = RES.MINID OR stat.results_id = RES.MAXID)

相关问题