PL/pgSQL初学之路(三)

本文主要记录在实操postgreSQL时遇到的各种报错,主要内容涉及select A as B, C over partition by B报错和子查询的列过多报错。

查询时的字段替代问题(一条语句多个命令的执行顺序)

该问题经常发生于下列语句中:

select class,
       age,
       grade,
	   ceil(rn:: double precision / 2) as group_no,
	   row_number() over (partition by class, ceil(rn:: double precision / 2) order by age desc) as rank
from new_grade_list;

假设我们的new_grade_list表是这样的:
在这里插入图片描述
那么上述SQL语句是正确的,功能是将class和group_no都相同的数据分为一组,在组内进行排名,返回的结果是:
在这里插入图片描述
那么观察上述语句会发现,我们之前在select ceil(rn:: double precision / 2) 的时候已经写了as group_no,即用字段group_no表示ceil(rn:: double precision / 2) 的执行结果,是否可以在下面partition by 语句中将此处的ceil(rn:: double precision / 2) 替代为group_no呢?即上述的代码是否可以写成如下的形式呢?

select class,
       age,
       grade,
	   ceil(rn:: double precision / 2) as group_no,
	   row_number() over (partition by group_no order by age desc) as rank
from new_grade_list;

答案是否定的,执行上述代码会报错。这是因为这一条select语句的全部内容是同时执行的,被选择的字段是并列关系不是先后执行关系。
但是如果我们还是想利用group_no来表示可以吗?其实是可以的,但是只能利用两个select语句的嵌套了:

select *,
	   row_number() over (partition by class, group_no order by age desc) as rank
from(
	   select class,
        	  age,
      	 	  grade,
	   		  ceil(rn:: double precision / 2) as group_no,
		from new_grade_list) as df1;

运行结果:
在这里插入图片描述
得到与之前相同的结果,但是语句嵌套明显更复杂了,所以还是推荐大家按第一种写法,不要偷懒。

subquery has too many columns(子查询有太多字段)

这个报错发生于where col1 in (select col1, col2 from table1)这种语句中,意思是子查询的列过多。那么想要解决这一个bug首先我们需要了解造成这个bug的原因是什么。
例如,执行下列语句:

select class,
       age,
	   grade,
	   rn
from new_grade_list
where age in (select age,
			         grade
			 from grade_list);

结果:
在这里插入图片描述
不出所料地报错了,这是因为我们对外层的select的限制条件是age字段,而内层的select的字段却不光有age,还有grade字段。改正的方法即删除内嵌语句中的grade字段,代码如下:

select class,
       age,
	   grade,
	   rn
from new_grade_list
where age in (select age
			 from grade_list);

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值