SQL中关于视图的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL中关于视图的问题相关的知识,希望对你有一定的参考价值。

在视图中根据某个字段进行排序,总是提示说"在视图中除非指定top值,否则不能使用order by".可是我想到对视图中的全部纪录排序.

请问这个问题该如何解决,好什么比较好的办法吗?

先谢谢大家了!

参考技术A 楼上的变通办法不错,可以试试.
不过我个人觉得为什么要在视图里排序.
视图的最终结果还是要当表来使用,在最后使用的时候再排序不就行了.
参考技术B 视图就是个SQL 语句 在TOP 后面 写一个很大的数字或者大于等于你的字段数就可实现,就是有点死.呵呵
我也期待其他兄弟的答案!本回答被提问者采纳

SQL 语句中关于 NULL 的那些坑

问题描述

 

今天在跟进公司内部测试平台线上问题的时候,发现一个忽略已久的问题。

 

为了简化问题描述,将其进行了抽象。

 

有一张数据表qms_branch,里面包含了一批形式如下所示的数据:

 

idnametypes
1 dashboard_trunk dashboard
2 monkey_trunk monkey
3 dashboard_projects_10_9_9 dashboard
4 performance_trunk  
5 performance_projects_10_9_8 performance

 

在系统的某个页面中,需要展示出所有dashboard类型以外的分支,于是就采用如下方式进行查询(Rails)。

 

branches = Qms::Branch.where("types!=‘dashboard‘")

 

这个方式有问题么?

 

之前我是觉得没什么问题。但是在代码上线后,实际使用时发现部分分支没有加载出来,这就包括了performance_trunk分支。

 

然后就是问题定位,到MySQL的控制台采用SQL语句进行查询:

 

SELECT * FROM qms_branch WHERE types != ‘dashboard‘

 

发现在查询结果中的确没有包含performance_trunk分支。

 

这是什么原因呢?为什么在第4条数据中,types属性的值明明就不是dashboard,但是采用types!=‘dashboard‘就无法查询得到结果呢?

 

原因追溯

 

查看数据表qms_branch的结构,看到types字段的属性为:DEFAULT NULL。

经过查询资料,在w3schools上找到了答案。

 

  • NULL is used as a placeholder for unknown or inapplicable values, it is treated differently from other values.

     

  • It is not possible to test for NULL values with comparison operators, such as =, <, or <>. We will have to use the IS NULL and IS NOT NULL operators instead.

 

也就是说,在SQL中,NULL并不能采用!=与数值进行比较,若要进行比较,我们只能采用IS NULL或IS NOT NULL。

 

于是,我们将SQL语句改为如下形式:

 

SELECT * FROM qms_branch WHERE types IS NULL or types != ‘dashboard‘

 

再次查询时,结果集就包含performance_trunk分支了。

 

问题延伸

 

通过上面例子,我们知道在对NULL进行判断处理时,只能采用IS NULL或IS NOT NULL,而不能采用=, <, <>, !=这些操作符。

 

那除此之外,还有别的可能存在的坑么?

 

再看一个例子:

 

有一张数据表table_foo,其中有一个字段value_field,我们想从这张表中筛选出所有value_field为’value1’,’value2’或NULL的记录。

 

那么,我们采用IN操作符,通过如下SQL语句进行查询。

 

SELECT * FROM table_foo WHERE value_field IN (‘value1‘, ‘value2‘, NULL)

 

这会存在问题么?我们并没有采用=, <, <>, !=对NULL进行比较哦。

 

答案是同样存在问题!

 

因为在SQL中,IN语句会被转换为多个=语句。例如,上面例子中的SQL在执行时就会被转换为如下SQL语句:

 

SELECT * FROM table_foo WHERE value_field = ‘value1‘ OR value_field = ‘value2‘ OR value_field = NULL

 

而这个时候,执行value_field = NULL时就会出现问题了。

 

正确的做法应该是将NULL相关的判断独立出来,如下SQL才是正确的写法。

 

SELECT * FROM table_foo WHERE value_field IN (‘value1‘, ‘value2‘) OR value_field IS NULL

以上是关于SQL中关于视图的问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL中关于条件Count的查询语句问题

计算 SQL 表中关于列的相同记录

在Sql中关于charindex的效率问题。

MVC中关于header的问题

SQL 语句中关于 NULL 的那些坑

SQL语句中关于select……like的问题