sql >> Databáze >  >> RDS >> Sqlserver

Vytvořte vypočítaný sloupec, který používá data z jiné tabulky na serveru SQL Server

Všeobecně známé omezení počítaných sloupců na SQL Serveru je, že nemají přístup k datům z jiných tabulek. To znamená, že váš výraz může používat sloupce ve stejné tabulce, ale ne z jiných tabulek.

Ale to je jen poloviční pravda. I když přímo ve výrazu nemůžete odkazovat na sloupec jiné tabulky, můžete vyvolat uživatelem definovanou funkci. A proto můžete vytvořit uživatelem definovanou funkci, která provede výpočet, který potřebujete, a poté tuto funkci jednoduše zavolat jako výraz vašeho vypočítaného sloupce.

Zde je příklad k demonstraci.

Ukázkové tabulky

Mám databázi s následujícími tabulkami:

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

Tyto tabulky ve skutečnosti obsahují více než 5 řádků. Vybral jsem prvních 5 řádků, abyste si udělali obrázek o struktuře dat a tabulky.

Nyní si představte, že chci přidat vypočítaný sloupec do první tabulky.

Chci, aby sloupec vypočítaný uváděl počet alb od každého interpreta. Jinými slovy, potřebuji to k počítání alb v další tabulce – Albums tabulka.

Vzhledem k tomu, že data jsou v jiné tabulce, nemohu na ně přímo odkazovat z vypočítaného sloupce. Ale mohu místo toho vytvořit uživatelsky definovanou funkci a odkazovat na tuto funkci z mého vypočítaného sloupce.

Vytvořte funkci

Zde je jednoduchá funkce, která počítá počet alb od daného interpreta:

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

Vytvořte vypočítaný sloupec

Nyní, když jsem vytvořil funkci, mohu přidat vypočítaný sloupec, který na ni odkazuje.

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

Otestujte vypočítaný sloupec

Nyní mohu spustit dotaz na Artists tabulka pro zobrazení výsledku mého vypočítaného sloupce:

SELECT TOP(10) * FROM Artists;

Výsledek:

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

Indexování

Vypočítaný sloupec v indexu můžete použít pouze v případě, že uživatelsky definovaná funkce, kterou vyvolává, má následující hodnoty vlastností:

  • IsDeterministic =pravda
  • IsSystemVerified =true (pokud vypočítaný sloupec není trvalý)
  • UserDataAccess =nepravda
  • SystemDataAccess =nepravda

  1. Zobrazení na serveru SQL Server

  2. Vkládání více řádků se sekvencí v Oracle

  3. PL/pgSQL kontroluje, zda řádek existuje

  4. Jak nastavit databázi PostgreSQL v Django