1

当从 PHPMyAdmin 执行时,我有两个查询可以在几秒钟内自行运行得相当快。

SELECT * FROM `testresults` WHERE `SCH_NAME` <> ''

SELECT AVG(pass_rate) FROM `testresults` WHERE `SCH_NAME` <> ''

但是,当我将第二个查询用作子查询时,查询运行速度很慢,以至于我达到了最大执行时间而什么也得不到。

SELECT 
      * 
FROM `testresults` 
WHERE pass_rate > (SELECT 
                      AVG(pass_rate) 
                   FROM `testresults` 
                     WHERE `SCH_NAME` <> ''
                  ) 
 AND `SCH_NAME` <> ''

似乎正在为每一行执行子查询,尽管该平均值是恒定的。我的查询中是否有一些不正确的地方导致它被解释为每行的平均变化?怎么可能改写?

4

3 回答 3

0

尝试子查询。未经测试,但像这样:

SELECT * FROM 
    `testresults` as tr , 
    (select avg(pass_rate) as passrate from testresults) as tr2
WHERE tr.`SCH_NAME` <> ''
and   tr.passrate > tr2.passrate
于 2013-01-30T05:02:57.410 回答
0

您的表中似乎有很多记录 sch_name 为空白,即SCH_NAME=''

尝试更改外部选择查询的 WHERE 子句中的条件位置。从左到右评估条件。

SELECT 
      * 
FROM `testresults` 
WHERE `SCH_NAME` <> '' AND pass_rate > (SELECT 
                                         AVG(pass_rate) 
                                        FROM `testresults` 
                                        WHERE `SCH_NAME` <> ''
                                      ) 

如果有记录SCH_NAME='',则不会评估子查询,即使用AND运算符时,如果第一个条件评估为 false,则不评估第二个条件。这称为短路

更好的方法是评估 AVG(pass_rate) 一次,将结果存储在一个变量中,并在 where 条件而不是子查询中使用这个变量。

 Declare @var int
    SET @var = (SELECT  AVG(pass_rate) 
               FROM `testresults` 
               WHERE `SCH_NAME` <> '')

     SELECT 
              * 
        FROM `testresults` 
        WHERE `SCH_NAME` <> '' AND pass_rate >@var
于 2013-01-30T05:27:28.663 回答
0

这适用于 Transact SQL:

   select
    testresults.*
   from
    testresults
       inner join 
         (
              select 
                  AVG(pass_rate) as calculated_avg 
              from testresults 
               where sch_name <> ''
         ) p 
           on (testresults.pass_rate > p.calculated_avg)
    where sch_name <> ''
于 2013-01-30T05:09:37.323 回答