1

PHPMyAdmin から実行すると、数秒以内に、それ自体でかなり高速に実行される 2 つのクエリがあります。

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

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

ただし、2 番目のクエリをサブクエリとして使用すると、クエリの実行が非常に遅くなり、最大実行時間に達しても何も得られません。

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

その平均は一定ですが、サブクエリはすべての行に対して実行されているようです。平均が各行で変化するかのように解釈される原因となる、クエリに誤りがありますか? どのように書き換えることができますか?

4

3 に答える 3

0

これはTransactSQLで機能します。

   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 に答える
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 と評価された場合、2 番目の条件は評価されません。これは短絡と呼ばれます。

より良い方法は、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 に答える