いくつかの問題があります。
- サブクエリからセミコロンを削除します。
- 相関サブクエリを値式として使用しようとしています。それは問題ありませんが、そのためには括弧で囲む必要があります。関数の括弧のセットが 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
テーブルには別の結合条件が必要なのではないでしょうか?