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

Opret en beregnet kolonne, der bruger data fra en anden tabel i SQL Server

En almindeligt kendt begrænsning af beregnede kolonner i SQL Server er, at de ikke kan få adgang til data fra andre tabeller. Det vil sige, at dit udtryk kan bruge kolonner i den samme tabel, men ikke fra andre tabeller.

Men dette er kun halvt sandt. Selvom du ikke kan referere til en anden tabels kolonne direkte i dit udtryk, kan aktivere en brugerdefineret funktion. Og derfor kan du oprette en brugerdefineret funktion, der udfører den beregning, du har brug for, og derefter blot kalde den funktion som din beregnede kolonnes udtryk.

Her er et eksempel til at demonstrere.

Eksempeltabeller

Jeg har en database med følgende tabeller:

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         |
+-----------+------------------------+---------------+------------+-----------+

Disse tabeller indeholder faktisk mere end 5 rækker. Jeg har valgt de øverste 5 rækker, så du får billedet af data og tabelstruktur.

Forestil dig nu, at jeg vil tilføje en beregnet kolonne til den første tabel.

Jeg vil have, at den beregnede kolonne angiver antallet af album fra hver kunstner. Med andre ord, jeg har brug for det til at tælle albummene i den anden tabel – Albums tabel.

Da dataene er i en anden tabel, kan jeg ikke referere til dem direkte fra en beregnet kolonne. Men jeg kan oprette en brugerdefineret funktion i stedet og henvise til den funktion fra min beregnede kolonne.

Opret funktionen

Her er en simpel funktion, der tæller antallet af albums fra en given kunstner:

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

Opret den beregnede kolonne

Nu hvor jeg har oprettet funktionen, kan jeg tilføje en beregnet kolonne, der refererer til den.

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

Test den beregnede kolonne

Nu kan jeg køre en forespørgsel mod Artists tabel for at se resultatet af min beregnede kolonne:

SELECT TOP(10) * FROM Artists;

Resultat:

+------------+------------------+--------------+-------------+--------------+
| 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            |
+------------+------------------+--------------+-------------+--------------+

Indeksering

Du kan kun bruge den beregnede kolonne i et indeks, hvis den brugerdefinerede funktion, som den aktiverer, har følgende egenskabsværdier:

  • Er deterministisk =sandt
  • Er SystemVerified =sand (medmindre den beregnede kolonne er vedvarende)
  • UserDataAccess =falsk
  • SystemDataAccess =falsk

  1. 9 vitale opgaver, som DBA'er er ansvarlige for

  2. Sådan INSERT Hvis række ikke eksisterer (UPSERT) i MySQL

  3. Installer mysql-python (Windows)

  4. Sådan konverteres PostgreSQL 9.4's jsonb-type til at flyde