0

他のテーブルの他のテーブルの列の平均を使用してテーブルから選択しようとしています。スキーマは次のとおりです。

学生( sid, firstname, l astname, status, gpa, email)

登録( sidclassidlgrade)

成績( lgrade, ngrade)

そして、間違ったクエリは、

select sid, lastname, 
avg( select g.ngrade from grades g, enrollments e 
    where e.sid = sid and g.lgrade = e.lgrade and e.lgrade is not null 
    and g.ngrade is not null) as cgpa
from students
order by cgpa asc;
4

3 に答える 3

1

サブクエリからセミコロンを削除します。

于 2013-04-08T23:45:46.893 に答える
1

いくつかの問題があります。

  • サブクエリからセミコロンを削除します。
  • 相関サブクエリを値式として使用しようとしています。それは問題ありませんが、そのためには括弧で囲む必要があります。関数の括弧のセットが 1 つだけ表示されavg()ます。
  • また、列にエイリアスがありません。意図を明確に表現するために、一貫性を保ち、全体を通してエイリアスを使用する必要があります。
  • 最後に、GROUP BY節がどこかに必要です。

全体として、集計は括弧内にある必要があると思います。

試す:

select
   sid,
   lastname, 
   (
      select avg(g.ngrade)
      from grades g, enrollments e 
      where e.sid = sid and g.lgrade = e.lgrade
      and g.ngrade is not null
   ) as cgpa
from students
order by cgpa asc;

その他の注意:条件により、null にならないことが既に保証されているe.lgrade is not nullため、必要ありません。g.lgrade = e.lgrade

最後に、ANSI 結合構文を学習することをお勧めします。後で感謝します。真剣に、古いスタイルの結合を使用するのはひどいことです。

select
   s.sid,
   s.lastname, 
   (
      select avg(g.ngrade)
      from
         grades g
         inner join enrollments e
            on g.lgrade = e.lgrade
      where
         g.ngrade is not null
         and s.sid = g.sid
   ) as cgpa
from students s
order by cgpa asc;

実際、クエリをこのように書き直すだけで何が問題なのかが明らかになるのではないかgradesと思います。テーブルとenrollmentsテーブルには別の結合条件が必要なのではないでしょうか?

于 2013-04-09T00:34:26.473 に答える