Quello subquery
che hai nel tuo codice è chiamato tabella derivata . Non è una tabella di base ma una tabella che "vive" durante il periodo di esecuzione della query. Come le viste (che sono anche chiamate tabelle visualizzate ) - e nelle versioni recenti CTE, che è un altro, quarto modo per "definire" una tabella all'interno di una query, sono simili a una tabella in molti modi. Puoi select
da loro, puoi usarli dentro from
o su di join
loro su altri tavoli (base o no!).
In alcuni DBMS (non tutti i DBMS lo hanno implementato allo stesso modo) queste tabelle / viste sono aggiornabili . E "aggiornabile" significa che possiamo anche update
, insert
dentro o delete
da loro.
Vi sono tuttavia delle restrizioni e questo è previsto. Immagina se subquery
fosse un join di 2 (o 17 tavoli). Cosa delete
significherebbe allora? (da quali tabelle devono essere eliminate le righe?) Le viste aggiornabili sono una questione molto complicata . C'è un recente libro (2012), interamente su questo argomento, scritto da Chris Date, noto esperto di teoria relazionale: Visualizza aggiornamento e teoria relazionale .
Quando la tabella derivata (o vista) è una query molto semplice, come se avesse solo una tabella di base (possibilmente limitata da una WHERE
) e no GROUP BY
, allora ogni riga della tabella derivata corrisponde a una riga nella tabella di base sottostante, quindi è facile * per aggiornare, inserire o eliminare da questo.
Quando il codice all'interno della sottoquery è più complesso, dipende dal fatto che le righe della tabella / vista derivata possano essere tracciate / risolte in righe da una delle tabelle di base sottostanti.
Per SQL Server, si può leggere di più nel aggiornabili Visualizzazioni paragrafo in MSDN: CREATE VIEW
.
Visualizzazioni aggiornabili
È possibile modificare i dati di una tabella di base sottostante tramite una vista, purché siano vere le seguenti condizioni:
Qualsiasi modifica, incluso UPDATE
, INSERT
e le DELETE
istruzioni, devono fare riferimento a colonne da una sola tabella di base.
Le colonne che vengono modificate nella vista devono fare direttamente riferimento ai dati sottostanti nelle colonne della tabella. Le colonne non possono essere derivate in nessun altro modo, ad esempio attraverso:
Una funzione di aggregazione: AVG
, COUNT
, SUM
, MIN
, MAX
, GROUPING
, STDEV
, STDEVP
, VAR
, e VARP
.
Un calcolo. La colonna non può essere calcolata da un'espressione che utilizza altre colonne. Colonne che si formano in base alle operatori di insieme UNION
, UNION ALL
, CROSSJOIN
, EXCEPT
, e INTERSECT
ammontano a un calcolo e non sono aggiornabili.
Le colonne in corso di modifica non sono interessati da GROUP BY
, HAVING
o DISTINCT
clausole.
TOP
non viene utilizzato da nessuna parte nel select_statement della vista insieme alla WITH CHECK OPTION
clausola.
Le restrizioni precedenti si applicano a qualsiasi subquery nella FROM
clausola della vista, così come si applicano alla vista stessa. Generalmente, Motore di database deve essere in grado di tracciare in modo inequivocabile le modifiche dalla definizione della vista a una tabella di base.
In realtà delete
è più facile, meno complesso di update
. SQL Server richiede solo le chiavi primarie o un altro modo per identificare quali righe della tabella di base devono essere eliminate. Per update
, c'è una restrizione (piuttosto ovvia) aggiuntiva che non possiamo aggiornare una colonna calcolata. Puoi provare a modificare la tua query per effettuare un aggiornamento. L'aggiornamento CreatedDateTime
probabilmente funzionerà RowNumber
correttamente, ma il tentativo di aggiornare la colonna calcolata genererà un errore. Ed insert
è ancora più complesso, poiché dovremmo fornire valori per tutte le colonne della tabella di base che non hanno un DEFAULT
vincolo.