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

मैं बिना ड्रॉप के tblPurchase और tblProductStock तालिका कैसे रख सकता हूं। (मुझे बिना ड्रॉप के टेबल और वैल्यू दोनों को स्थायी रखने की जरूरत है)

अनुक्रमित दृश्य

अनुक्रमित दृश्य संभव है।

एक अनुक्रमित दृश्य एक ऐसा दृश्य है जिस पर एक संकुल अनुक्रमणिका होती है, और डेटा वास्तव में डिस्क पर संग्रहीत होता है।

जैसा कि मैं इसे समझता हूं, आप tblProduct में संग्रहीत प्रति उत्पाद आइटम की खरीदारी का योग रखने का प्रयास कर रहे हैं . मैंने मान लिया है कि ItemCode tblProduct का PK है और वह ItemName . है वहां भी परिभाषित किया गया है (हम MAX . का उपयोग नहीं कर सकते हैं अनुक्रमित दृश्य में)। तो हम एक दृश्य को इस तरह परिभाषित कर सकते हैं:

CREATE VIEW dbo.vwTotalPurchases
WITH SCHEMABINDING  -- must be schema bound, we cannot change underlying columns after creation
AS
SELECT
   ItemCode,
   SUM(Quantity) QuantityPurchased,
   COUNT_BIG(*) CountPurchases  -- if we group, must have count also, so that rows can be maintained
FROM dbo.tblPurchase  -- must use two-part names
GROUP BY itemCode;
GO

फिर हम डिस्क पर इसे बनाए रखने के लिए उस पर क्लस्टर्ड इंडेक्स बना सकते हैं। जब भी बेस टेबल में कोई अपडेट होता है तो SQL सर्वर इंडेक्स को बनाए रखेगा। अगर ग्रुपिंग में कोई और पंक्तियाँ नहीं हैं (गिनती 0 होने से पहचानी जाती है), तो पंक्ति हटा दी जाती है:

CREATE UNIQUE CLUSTERED INDEX PK_vwTotalPurchases ON dbo.vwTotalPurchases (ItemCode);
GO

अब अगर हम इसे क्वेरी करना चाहते हैं, तो हम इस दृश्य को tblProducts . पर छोड़ सकते हैं (बाएं शामिल हों क्योंकि कोई खरीदारी नहीं हो सकती है):

SELECT
    p.ItemCode,
    p.ItemName,
    ISNULL(tp.QuantityPurchased, 0) QuantityPurchased,
    ISNULL(tp.CountPurchases, 0) CountPurchases
FROM tblProducts p
LEFT JOIN vwTotalPurchases tp WITH (NOEXPAND) ON tp.ItemCode = p.ItemCode;

हम इसे एक दृश्य के रूप में भी परिभाषित कर सकते हैं (एक अनुक्रमित नहीं, बल्कि एक मानक दृश्य) ताकि परिभाषा कहीं भी प्रयोग करने योग्य हो।

NOEXPAND पर ध्यान दें :

यदि आप SQL सर्वर एंटरप्राइज़ या डेवलपर संस्करण पर नहीं हैं, तो आपको संकेत WITH (NOEXPAND) का उपयोग करना चाहिए इसे इंडेक्स का उपयोग करने के लिए बाध्य करने के लिए, अन्यथा यह आधार tblPurchase . को क्वेरी करेगा बजाय। और उन संस्करणों में भी, NOEXPAND . का उपयोग करना सबसे अच्छा है ।

देखें यह लेख इस पर पॉल व्हाइट द्वारा।




  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 सर्वर डेटाबेस में विदेशी कुंजी बाधाओं को कैसे छोड़ें - SQL सर्वर / TSQL ट्यूटोरियल भाग 72

  2. आप SQL प्रबंधन स्टूडियो में एक भिन्न पोर्ट नंबर कैसे निर्दिष्ट करते हैं?

  3. SQL सर्वर लेनदेन में SET XACT_ABORT चालू कैसे करें?

  4. क्या आप डेटाबेस में साझा तालिका प्रकार की अनुमति देने के लिए एक सीएलआर यूडीटी बना सकते हैं?

  5. कौन सा SQL कमांड एक सुरक्षा व्यवस्थापक को डेटाबेस तक पहुँच प्रदान करता है?