本文主要记录在实操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);
结果: