-
View 视图
查询视图的使用,便于打破存储结构,向用户呈现更有针对性,或更全面的,或更易于理解的数据结构和记录。
-
ROW_NUMBER() 函数
ROW_NUMBER() 函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。
语法:ROW_NUMBER () OVER ([ <partition_by_clause> ] <order_by_clause>) 。
备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
参数:<partition_by_clause> :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。
<order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。
返回类型:bigint 。
举例:
SQL:
SELECT
ROW_NUMBER() OVER(PARTITION BY recovery_model_desc ORDER BY name ASC)
AS Row#,
name, recovery_model_desc
FROM sys.databases WHERE database_id < 5;
结果集:
Row# | name | recovery_model_desc |
1 | master | SIMPLE |
1 | model | FULL |
2 | msdb | SIMPLE |
3 | tempdb | SIMPLE |
-
视图中使用ROW_NUMBER() 函数的注意事项
如果在前边示例中加入row-number():
create view column_view as
select
ROW_NUMBER() OVER(ORDER BY t1.object_id ASC) AS Row#,
t1.type,t1.object_id,t1.name as tab,t2.name as col
from sys.objects t1 inner join sys.all_columns t2 on t1.object_id = t2.object_id
此时执行下列查询,就会先按视图的定义返回关联的两个表的所有行,则会有数千行中间结果,然后再执行where条件过滤出需要的十数行结果,当关联的基本表数据行达到一定量时,会产生大量中间结果,而影响性能:
select * from column_view where type = 'S' and tab = 'sysrscols'
所以在视图中使用ROW_NUMBER() 函数要当心,可以避免使用或在查询视图时,忽略ROW_NUMBER() 函数的列:
select type,tab,col from column_view where type = 'S' and tab = 'sysrscols'
以上
祝你开心