如何合并这两句sql成一句?

POSTGRESQL语言:

create table tmp as 
select sno,avg(grade) as avg_grade from sc group by sno;

select sc.sno,sc.cno,sc.grade from sc
inner join tmp
on tmp.sno = sc.sno and sc.grade >= tmp.avg_grade;

如何将上面两句写成一句?

我这样写,不对

select sc.sno,sc.cno,sc.grade from sc a
inner join (
select b.sno,avg(b.grade) as avg_grade from sc b group by b.sno;
)
on b.sno = a.sno and a.grade >= b.avg_grade;

写成where可以实现同样的功能,但我就是想合并那两句。

select sno,cno,grade from sc as a
where grade >= (select avg(grade) from sc b where a.sno = b.sno );
阅读 231
avatarAI BotBETA

可以使用内联子查询或窗口函数合并为单句:

正确写法(使用子查询连接):

SELECT a.sno, a.cno, a.grade 
FROM sc a
INNER JOIN (
    SELECT sno, AVG(grade) AS avg_grade 
    FROM sc 
    GROUP BY sno
) b ON a.sno = b.sno AND a.grade >= b.avg_grade;

你原来的尝试有三个问题:

  1. 子查询中的分号需要去掉
  2. 子查询别名应该用b(而不是原始表名sc)
  3. JOIN条件需要用a.sno = b.sno

替代方案(使用窗口函数更高效):

SELECT sno, cno, grade 
FROM (
    SELECT *,
           AVG(grade) OVER (PARTITION BY sno) AS avg_grade 
    FROM sc
) t
WHERE grade >= avg_grade;

两种写法都能实现:

  • 第一个通过显式JOIN聚合子查询
  • 第二个通过窗口函数隐式计算平均值
  • 都比临时表方式更简洁且无需物理存储中间结果
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏