Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Buat Kolom Terhitung yang Menggunakan Data dari Tabel Lain di SQL Server

Batasan kolom terkomputasi yang diketahui secara luas di SQL Server adalah kolom tersebut tidak dapat mengakses data dari tabel lain. Artinya, ekspresi Anda dapat menggunakan kolom dalam tabel yang sama, tetapi tidak dari tabel lain.

Tapi ini hanya setengah benar. Meskipun Anda tidak dapat mereferensikan kolom tabel lain secara langsung dalam ekspresi Anda, Anda dapat memanggil fungsi yang ditentukan pengguna. Oleh karena itu, Anda dapat membuat fungsi yang ditentukan pengguna yang melakukan penghitungan yang Anda perlukan, lalu cukup panggil fungsi tersebut sebagai ekspresi kolom yang dihitung.

Berikut ini contoh untuk didemonstrasikan.

Tabel Contoh

Saya memiliki database dengan tabel berikut:

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

Tabel ini sebenarnya berisi lebih dari 5 baris. Saya telah memilih 5 baris teratas sehingga Anda mendapatkan gambaran tentang data dan struktur tabel.

Sekarang, bayangkan saya ingin menambahkan kolom terhitung ke tabel pertama.

Saya ingin kolom yang dihitung untuk memberikan jumlah album dari setiap artis. Dengan kata lain, saya membutuhkannya untuk menghitung album di tabel lain – Albums tabel.

Melihat data ada di tabel lain, saya tidak bisa merujuknya langsung dari dalam kolom yang dihitung. Tetapi saya dapat membuat fungsi yang ditentukan pengguna sebagai gantinya, dan merujuk fungsi itu dari dalam kolom yang saya hitung.

Buat Fungsi

Berikut adalah fungsi sederhana yang menghitung jumlah album dari artis tertentu:

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

Buat Kolom yang Dihitung

Sekarang setelah saya membuat fungsi, saya dapat menambahkan kolom terhitung yang mereferensikannya.

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

Uji Kolom yang Dihitung

Sekarang saya dapat menjalankan kueri terhadap Artists tabel untuk melihat hasil kolom yang saya hitung:

SELECT TOP(10) * FROM Artists;

Hasil:

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

Pengindeksan

Anda hanya dapat menggunakan kolom yang dihitung dalam indeks jika fungsi yang ditentukan pengguna yang dipanggil memiliki nilai properti berikut:

  • ApakahDeterministik =benar
  • IsSystemVerified =true (kecuali kolom yang dihitung tetap ada)
  • UserDataAccess =salah
  • SystemDataAccess =salah

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyisipkan baris ke dalam tabel dengan satu kolom IDENTITAS saja

  2. Bagaimana cara menggabungkan banyak baris dengan id yang sama di sql?

  3. Cara Membuat Prosedur Tersimpan Terikat Skema di SQL Server

  4. Menghindari injeksi SQL tanpa parameter

  5. Replikasi Sql Server memerlukan nama server yang sebenarnya untuk membuat koneksi ke server