Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tạo một cột được tính toán sử dụng dữ liệu từ một bảng khác trong SQL Server

Một hạn chế được biết đến rộng rãi của các cột được tính toán trong SQL Server là chúng không thể truy cập dữ liệu từ các bảng khác. Nghĩa là, biểu thức của bạn có thể sử dụng các cột trong cùng một bảng, nhưng không sử dụng từ các bảng khác.

Nhưng điều này chỉ đúng một nửa. Mặc dù bạn không thể tham chiếu trực tiếp đến cột của bảng khác trong biểu thức của mình, nhưng bạn có thể gọi một chức năng do người dùng xác định. Và do đó, bạn có thể tạo một hàm do người dùng xác định để thực hiện phép tính bạn cần, sau đó chỉ cần gọi hàm đó dưới dạng biểu thức của cột được tính toán của bạn.

Đây là một ví dụ để chứng minh.

Bảng mẫu

Tôi có một cơ sở dữ liệu với các bảng sau:

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

Các bảng này thực sự chứa nhiều hơn 5 hàng. Tôi đã chọn 5 hàng trên cùng để bạn có được bức tranh về dữ liệu và cấu trúc bảng.

Bây giờ, hãy tưởng tượng tôi muốn thêm một cột được tính vào bảng đầu tiên.

Tôi muốn cột được tính toán cung cấp số lượng album của mỗi nghệ sĩ. Nói cách khác, tôi cần nó để đếm các album trong bảng khác - Albums bảng.

Vì dữ liệu nằm trong một bảng khác nên tôi không thể tham chiếu dữ liệu đó trực tiếp từ bên trong một cột được tính toán. Nhưng thay vào đó, tôi có thể tạo một hàm do người dùng xác định và tham chiếu hàm đó từ bên trong cột được tính toán của mình.

Tạo hàm

Đây là một chức năng đơn giản đếm số lượng album từ một nghệ sĩ nhất định:

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

Tạo cột được tính toán

Bây giờ tôi đã tạo hàm, tôi có thể thêm một cột được tính toán tham chiếu đến nó.

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

Kiểm tra cột được tính toán

Bây giờ tôi có thể chạy một truy vấn đối với Artists bảng để xem kết quả của cột đã tính của tôi:

SELECT TOP(10) * FROM Artists;

Kết quả:

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

Lập chỉ mục

Bạn chỉ có thể sử dụng cột được tính toán trong một chỉ mục nếu hàm do người dùng xác định mà nó gọi có các giá trị thuộc tính sau:

  • IsDeterministic =true
  • IsSystemVerified =true (trừ khi cột đã tính được duy trì)
  • UserDataAccess =false
  • SystemDataAccess =false

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách loại bỏ tiêu đề cột khi gửi kết quả truy vấn qua email trong SQL Server (T-SQL)

  2. Trả lại số hàng bị ảnh hưởng bởi câu lệnh UPDATE

  3. Sử dụng DateTime trong SqlParameter cho thủ tục được lưu trữ, lỗi định dạng

  4. Khắc phục Msg 8117 “Kiểu dữ liệu toán hạng varchar không hợp lệ cho toán tử sum” trong SQL Server

  5. Thủ thuật nhanh và tốt nhất để khôi phục tệp SQL Server MDF