在subquery
你有你的代码被称为派生表。它不是基表,而是在查询运行期间“存在”的表。就像视图(也称为查看表)一样,在最新版本的CTE中,它是在查询中“定义”表的另一种第四种方法,它们在许多方面都类似于表。您可以select
从中使用它们,也可以在其他表中使用它们,也可以from
将join
它们用于其他表(是否为基!)。
在某些DBMS中(并非所有DBMS都以相同的方式实现),这些表/视图是可更新的。而“更新”的意思,我们也可以update
,insert
进入或delete
从他们。
虽然有限制,但这是预期的。想象如果subquery
是2(或17个表)的联接。那是什么delete
意思呢?(应该从哪些表中删除行?)可更新视图是非常复杂的事情。最近有一部有关该主题的新书(2012年),是由关系理论领域的著名专家克里斯·伊达斯(Chris Date)撰写的:《视图更新和关系理论》。
如果派生表(或视图)是一个非常简单的查询,例如它只有一个基表(可能受a限制WHERE
),而no GROUP BY
,则派生表的每一行都对应于基础基表中的一行,因此它是易于*进行更新,插入或删除。
当子查询中的代码更复杂时,它取决于是否可以将派生表/视图的行跟踪/解析为来自基础基表之一的行。
对于SQL Server,可以在MSDN的“可更新视图”段落中阅读更多信息:CREATE VIEW
。
可更新的视图
只要满足以下条件,就可以通过视图修改基础基表的数据:
包括UPDATE
,INSERT
和DELETE
语句在内的任何修改都只能引用一个基本表中的列。
在视图中修改的列必须直接引用表列中的基础数据。不能以任何其他方式派生这些列,例如通过以下方式:
一个聚集函数:AVG
,COUNT
,SUM
,MIN
,MAX
,GROUPING
,STDEV
,STDEVP
,VAR
,和VARP
。
计算。无法从使用其他列的表达式中计算出该列。由使用所述一组符构成的列UNION
,UNION ALL
,CROSSJOIN
,EXCEPT
,和INTERSECT
量的计算,并且也不能更新。
被修改的列不受GROUP BY
,HAVING
或DISTINCT
条款。
TOP
在视图的select_statement中未与WITH CHECK OPTION
子句一起使用。
前面的限制适用于FROM
视图子句中的任何子查询,就像它们适用于视图本身一样。通常,数据库引擎必须能够明确跟踪从视图定义到一个基本表的修改。
实际上delete
比起来更容易,更简单update
。SQL Server只需要主键或其他方法来标识要删除基表的哪些行。对于update
,还有一个附加的(相当明显的)限制,即我们无法更新计算列。您可以尝试修改查询以进行更新。更新CreatedDateTime
可能会正常工作,但是尝试更新计算RowNumber
列将引发错误。而且insert
甚至更加复杂,因为我们必须为基本表的所有没有DEFAULT
约束的列提供值。