Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Creare una colonna calcolata che utilizzi i dati di un'altra tabella in SQL Server

Una limitazione ampiamente nota delle colonne calcolate in SQL Server è che non possono accedere ai dati da altre tabelle. Cioè, la tua espressione può utilizzare colonne nella stessa tabella, ma non da altre tabelle.

Ma questo è vero solo a metà. Anche se non puoi fare riferimento alla colonna di un'altra tabella direttamente all'interno della tua espressione, puoi richiamare una funzione definita dall'utente. Pertanto, potresti creare una funzione definita dall'utente che esegua il calcolo di cui hai bisogno, quindi chiamare semplicemente quella funzione come espressione della colonna calcolata.

Ecco un esempio da dimostrare.

Tabelle di esempio

Ho un database con le seguenti tabelle:

SELECT TOP(5) * FROM Artists;

+------------+------------------+--------------+-------------+
| ArtistId   | ArtistName       | ActiveFrom   | CountryId   |
|------------+------------------+--------------+-------------|
| 1          | Iron Maiden      | 1975-12-25   | 3           |
| 2          | AC/DC            | 1973-01-11   | 2           |
| 3          | Allan Holdsworth | 1969-01-01   | 3           |
| 4          | Buddy Rich       | 1919-01-01   | 6           |
| 5          | Devin Townsend   | 1993-01-01   | 8           |
+------------+------------------+--------------+-------------+


SELECT TOP(5) * FROM Albums;

+-----------+------------------------+---------------+------------+-----------+
| AlbumId   | AlbumName              | ReleaseDate   | ArtistId   | GenreId   |
|-----------+------------------------+---------------+------------+-----------|
| 1         | Powerslave             | 1984-09-03    | 1          | 1         |
| 2         | Powerage               | 1978-05-05    | 2          | 1         |
| 3         | Singing Down the Lane  | 1956-01-01    | 6          | 3         |
| 4         | Ziltoid the Omniscient | 2007-05-21    | 5          | 1         |
| 5         | Casualties of Cool     | 2014-05-14    | 5          | 1         |
+-----------+------------------------+---------------+------------+-----------+

Queste tabelle contengono effettivamente più di 5 righe. Ho selezionato le prime 5 righe in modo da ottenere l'immagine dei dati e della struttura della tabella.

Ora, immagina di voler aggiungere una colonna calcolata alla prima tabella.

Voglio che la colonna calcolata fornisca il numero di album di ciascun artista. In altre parole, mi serve per contare gli album nell'altra tabella:gli Albums tabella.

Visto che i dati si trovano in un'altra tabella, non posso farvi riferimento direttamente da una colonna calcolata. Ma posso invece creare una funzione definita dall'utente e fare riferimento a quella funzione dall'interno della mia colonna calcolata.

Crea la funzione

Ecco una semplice funzione che conta il numero di album di un determinato artista:

CREATE FUNCTION [dbo].[ufn_AlbumCount] (@ArtistId int)  
RETURNS smallint
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;
GO

Crea la colonna calcolata

Ora che ho creato la funzione, posso aggiungere una colonna calcolata che fa riferimento ad essa.

ALTER TABLE Artists
ADD AlbumCount AS dbo.ufn_AlbumCount(ArtistId);

Testare la colonna calcolata

Ora posso eseguire una query sugli Artists tabella per vedere il risultato della mia colonna calcolata:

SELECT TOP(10) * FROM Artists;

Risultato:

+------------+------------------+--------------+-------------+--------------+
| ArtistId   | ArtistName       | ActiveFrom   | CountryId   | AlbumCount   |
|------------+------------------+--------------+-------------+--------------|
| 1          | Iron Maiden      | 1975-12-25   | 3           | 5            |
| 2          | AC/DC            | 1973-01-11   | 2           | 3            |
| 3          | Allan Holdsworth | 1969-01-01   | 3           | 2            |
| 4          | Buddy Rich       | 1919-01-01   | 6           | 1            |
| 5          | Devin Townsend   | 1993-01-01   | 8           | 3            |
| 6          | Jim Reeves       | 1948-01-01   | 6           | 1            |
| 7          | Tom Jones        | 1963-01-01   | 4           | 3            |
| 8          | Maroon 5         | 1994-01-01   | 6           | 0            |
| 9          | The Script       | 2001-01-01   | 5           | 1            |
| 10         | Lit              | 1988-06-26   | 6           | 0            |
+------------+------------------+--------------+-------------+--------------+

Indicizzazione

Puoi utilizzare la colonna calcolata in un indice solo se la funzione definita dall'utente che richiama ha i seguenti valori di proprietà:

  • È deterministico =vero
  • Sistema verificato =true (a meno che la colonna calcolata non sia persistente)
  • Accesso ai dati utente =falso
  • Accesso ai dati di sistema =falso