Lo subquery
que tienes en tu código se llama tabla derivada . No es una tabla base, sino una tabla que "vive" durante el tiempo que se ejecuta la consulta. Al igual que las vistas (que también se llaman tablas vistas ), y en versiones recientes CTE, que es otra cuarta forma de "definir" una tabla dentro de una consulta, son similares a una tabla en muchos aspectos. Puede select
partir de ellos, se puede utilizar en from
o para join
ellos a otras tablas (base o no!).
En algunos DBMS, (no todos los DBMS han implementado esto de la misma manera) estas tablas / vistas son actualizables . Y "actualizable" significa que también podemos update
, desde insert
o delete
hacia ellos.
Sin embargo, existen restricciones y esto se espera. Imagine si subquery
se tratara de una unión de 2 (o 17 tablas). ¿Qué delete
significaría entonces? (¿de qué tablas se deben eliminar las filas?) Las vistas actualizables son un asunto muy complicado . Hay un libro reciente (2012), enteramente sobre este tema, escrito por Chris Date, conocido experto en teoría relacional: Ver actualización y teoría relacional .
Cuando la tabla derivada (o vista) es una consulta muy simple, como si tuviera solo una tabla base (posiblemente restringida por a WHERE
) y no GROUP BY
, entonces cada fila de la tabla derivada corresponde a una fila en la tabla base subyacente, por lo que es fácil * para actualizar, insertar o eliminar de esto.
Cuando el código dentro de la subconsulta es más complejo, depende de si las filas de la tabla / vista derivada se pueden rastrear / resolver en filas desde una de las tablas base subyacentes.
Para SQL Server, puede leer más en el párrafo vistas actualizables en MSDN: CREATE VIEW
.
Vistas actualizables
Puede modificar los datos de una tabla base subyacente a través de una vista, siempre que se cumplan las siguientes condiciones:
Cualquier modificación, incluidas UPDATE
, INSERT
y DELETE
declaraciones, debe hacer referencia a columnas de una sola tabla base.
Las columnas que se modifican en la vista deben hacer referencia directamente a los datos subyacentes en las columnas de la tabla. Las columnas no se pueden derivar de ninguna otra manera, como a través de lo siguiente:
Una función agregada: AVG
, COUNT
, SUM
, MIN
, MAX
, GROUPING
, STDEV
, STDEVP
, VAR
, y VARP
.
Un cómputo La columna no se puede calcular a partir de una expresión que usa otras columnas. Las columnas que se forman mediante el uso de los operadores de conjuntos UNION
, UNION ALL
, CROSSJOIN
, EXCEPT
, y INTERSECT
cantidad para un cálculo y también no son actualizables.
Las columnas están modificando no están afectados por GROUP BY
, HAVING
o DISTINCT
cláusulas.
TOP
no se usa en ninguna parte de la selección de la vista junto con la WITH CHECK OPTION
cláusula.
Las restricciones anteriores se aplican a cualquier subconsulta en la FROM
cláusula de la vista, tal como se aplican a la vista misma. En general, el Motor de base de datos debe poder rastrear sin ambigüedades las modificaciones de la definición de vista a una tabla base.
En realidad delete
es más fácil, menos complejo que update
. SQL Server solo necesita las claves primarias o alguna otra forma de identificar qué filas de la tabla base se eliminarán. Para update
, hay una restricción adicional (bastante obvia) que no podemos actualizar una columna calculada. Puede intentar modificar su consulta para hacer una actualización. La actualización CreatedDateTime
probablemente funcionará bien, pero intentar actualizar la RowNumber
columna calculada generará un error. Y insert
es aún más complejo, ya que tendríamos que proporcionar valores para todas las columnas de la tabla base que no tienen una DEFAULT
restricción.