您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

使用视图的准则

对于用于创建视图的 SELECT 语句以及能否在视图中插入数据、从视图中删除数据或更新视图,都存在特定的限制。

对于 SELECT 语句的限制

无法在 SELECT 查询中使用 ORDER BY 子句。关系表的一个特性是行或列的顺序没有特殊意义,而使用 ORDER BY 子句将在视图的行上强加顺序。可以在视图定义中使用 GROUP BY 子句、子查询和连接。

只在顶级 SELECT 列表中支持标量值子查询(视图、派生表或子查询均不支持)。有时顶级 SELECTFROM 子句中使用的视图或派生表非常简单,可以“展平”到顶级 SELECT。因此,之前的规则实际仅针对子查询、未展平的视图以及未展平的派生表强制执行。例如:

CREATE VIEW test_view AS SELECT testkey,(SELECT COUNT(*) FROM tagtests WHERE tagtests.testkey = testtrd.testkey ) FROM testtrd

SELECT * FROM test_view  

Msg 21, Level 14, State 0:

SQL Anywhere Error -1005004: Subqueries are allowed only as arguments of

comparisons, IN, and EXISTS,

-- (opt_Select.cxx 2101)

要规划一个视图,可以调整 SELECT 查询本身,直到其以所需格式提供完全符合需要的结果。调整好 SELECT 语句之后,即可在查询前面添加一个短语来创建视图。例如:

CREATE VIEW  AS

插入和删除视图的准则

有些视图允许使用 UPDATEINSERTDELETE 语句,有些视图不允许,具体取决于其关联的 SELECT 语句。

无法在包含以下内容的视图中执行更新、插入或删除:

  • 集合函数,如 COUNT(*)

  • SELECT 语句中的 GROUP BY 子句

  • UNION 操作

    在所有这些情况中,无法将 UPDATEINSERTDELETE 转换成对基础表的操作。 警告请不要删除 dbo 用户 ID 拥有的视图,该用户 ID 拥有系统对象。删除此类视图或将其转化为表可能导致意外的问题。