Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एक कंप्यूटेड कॉलम बनाएं जो SQL सर्वर में किसी अन्य तालिका से डेटा का उपयोग करता है

SQL सर्वर में गणना किए गए स्तंभों की एक व्यापक रूप से ज्ञात सीमा यह है कि वे अन्य तालिकाओं से डेटा तक नहीं पहुंच सकते हैं। अर्थात्, आपका व्यंजक एक ही तालिका में स्तंभों का उपयोग कर सकता है, लेकिन अन्य तालिकाओं से नहीं।

लेकिन यह सिर्फ आधा सच है। जबकि आप किसी अन्य तालिका के कॉलम को सीधे अपनी अभिव्यक्ति में संदर्भित नहीं कर सकते, आप कर सकते हैं उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन का आह्वान करें। और इसलिए, आप एक उपयोगकर्ता-परिभाषित फ़ंक्शन बना सकते हैं जो आपके लिए आवश्यक गणना करता है, फिर बस उस फ़ंक्शन को अपने परिकलित कॉलम की अभिव्यक्ति के रूप में कॉल करें।

प्रदर्शित करने के लिए यहां एक उदाहरण दिया गया है।

नमूना तालिकाएं

मेरे पास निम्न तालिकाओं वाला एक डेटाबेस है:

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

इन तालिकाओं में वास्तव में 5 से अधिक पंक्तियाँ होती हैं। मैंने शीर्ष 5 पंक्तियों का चयन किया है ताकि आपको डेटा और तालिका संरचना की तस्वीर मिल सके।

अब, कल्पना कीजिए कि मैं पहली तालिका में एक परिकलित कॉलम जोड़ना चाहता हूं।

मैं चाहता हूं कि गणना कॉलम प्रत्येक कलाकार से एल्बमों की संख्या प्रदान करे। दूसरे शब्दों में, मुझे दूसरी तालिका में एल्बमों की गणना करने की आवश्यकता है - Albums टेबल।

यह देखते हुए कि डेटा किसी अन्य तालिका में है, मैं इसे सीधे गणना किए गए कॉलम से संदर्भित नहीं कर सकता। लेकिन मैं इसके बजाय एक उपयोगकर्ता-परिभाषित फ़ंक्शन बना सकता हूं, और उस फ़ंक्शन को मेरे परिकलित कॉलम के भीतर से संदर्भित कर सकता हूं।

फ़ंक्शन बनाएं

यहां एक सरल फ़ंक्शन दिया गया है जो किसी दिए गए कलाकार के एल्बमों की संख्या की गणना करता है:

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

गणना कॉलम बनाएं

अब जब मैंने फ़ंक्शन बना लिया है, तो मैं एक परिकलित कॉलम जोड़ सकता हूं जो इसका संदर्भ देता है।

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

गणना कॉलम का परीक्षण करें

अब मैं Artists के विरुद्ध एक क्वेरी चला सकता हूं मेरे परिकलित कॉलम का परिणाम देखने के लिए तालिका:

SELECT TOP(10) * FROM Artists;

परिणाम:

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

अनुक्रमण

आप किसी अनुक्रमणिका में परिकलित स्तंभ का उपयोग केवल तभी कर सकते हैं, जब उपयोगकर्ता-परिभाषित फ़ंक्शन जिसे वह आमंत्रित करता है, उसमें निम्नलिखित गुण मान हों:

  • नियतात्मक है =सच
  • IsSystemVerified =सच (जब तक कि परिकलित कॉलम जारी न हो)
  • UserDataAccess =झूठा
  • SystemDataAccess =झूठा

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में Msg 8114 "डेटा प्रकार varchar को संख्यात्मक में बदलने में त्रुटि" को ठीक करें

  2. tsql किसी फ़ंक्शन या स्टोर प्रक्रिया से तालिका लौटा रहा है

  3. SQL सर्वर (T-SQL उदाहरण) में 'datetimeoffset' को 'datetime2' में बदलें

  4. SQL केस संवेदनशील स्ट्रिंग तुलना करें

  5. SQL तालिका से डुप्लिकेट पंक्तियों को हटाना (एकाधिक स्तंभों के मानों के आधार पर)