数据库处理错误总结(一)

总结一下这周的大部分时间都在跟sql较劲,总结一下自己遇到的几个错误,温故知新。

Oracle 不是 SELECTed 表达式

错误原因:更改select中的数据原来为

1
2
select xxx,xxx,a.creat_date ...
order by a.creat_date

后来改为

1
2
3
4
          select xxx,xxx,
to_char(a.create_date ,'yyyy-MM-dd HH12:MI:SS') as create_date
,...
order by a.creat_date

但没改order by里面的排序数据。

在ORDER BY中指定多个列,结果将先按照子句中的第一列排序,然后第二个,依此类推。
在SELECT中未出现的列名也可用于ORDER BY 子句中,只要TABLE中有就行。
但如果SELECT子句中出现了DISTINCT关键字,则只能用出现过的列名,
而且如果SELECT子句中使用了任何运算符,在ORDER BY 子句中必须保持和SELECT子句中表达式完全一致,否则出现错误:“ORA-01791: 不是 SELECTed 表达式”。

耗时长原因:

1. 对sql语句不熟悉
2. 对错误不熟悉,遇到错误的时候,错误的认为是sql语句中的to_char使用错误,导致长时间的困在如何格式化数据上面。

总结:遇到错误不能错误的猜测你错误的原因,要到网上查,确定错误的原因,不然会做很多的无用功,走错了方向真的越走错的越深。

在连接条件中加查询

1
2
3
4
5
6
SELECT
*
FROM
`klass`
LEFT JOIN teacher ON klass.teacher_id = teacher.id
AND klass.link = '2'

在左连接中筛选条件不应写在连接条件中,因为左连接会完整的带出所有的左表数据,后面的连接条件不会起作用,
错误的在连接条件中加入了筛选条件。

在sum函数里面加distinct

代码如下:

1
2
3
4
5
6
7
8
SUM ( distinct
CASE
WHEN xxxxx THEN
1
ELSE
0
END
)

distinct 加上之后,会把所有的重复1给去掉,最后的结果就只有一个1,就错误的显示总共和为1了。

推荐文章