2011-07-28 26 views
14

मुझे यकीन है कि के लिए नहीं है कि इस बारे में जाने के लिए सबसे अच्छा तरीका है कर रहा हूँ से चयन करें, तो मैं व्याख्या करेंगे कि अंतिम लक्ष्य क्या है, और अगर एक गणना स्तंभ जवाब है तो मेरी मदद कृपया उस मार्ग पर जाएं, या शायद एक बेहतर मार्ग।एसक्यूएल सर्वर अभिकलन स्तंभ एक और तालिका

आदेश

OrderId 
PackageId 
MediaSpend 
TotalAdViews (Computed column) 

संकुल

PackageId 
BaseAdViews 

प्रत्येक आदेश एक पैकेज आता है कि के साथ 1,000 दृश्यों कहना असाइन किया गया है, तो आप खरीद सकते हैं:

मैं दो तालिकाओं है अधिक मीडिया पाने के लिए अधिक मीडिया खर्च करते हैं। मैं TotalAdViews नामक कॉलम बनाना चाहता था जो बेसएड व्यूज़ + मीडियास्पेंड जोड़ देगा। मेरी समझ से अगर दृढ़ता सक्षम होती है तो कॉलम को पूछे जाने पर हर बार पुन: गणना करने की आवश्यकता नहीं होगी, जो प्रदर्शन में सहायता कर सकता है।

मैं अपने गणना स्तंभ में एक और मेज से एक मूल्य कैसे मिलता है? या कृपया मेरा लक्ष्य पूरा करने का एक वैकल्पिक तरीका सुझाएं।

उत्तर

13

आप एक गणना स्तंभ अभिव्यक्ति के भीतर एक और तालिका में कॉलम का उपयोग करने में सक्षम नहीं होगा। यह MSDN documentation से निकाला गया है।

एक गणना कॉलम एक अभिव्यक्ति से गणना की जाती है जो एक ही तालिका में अन्य कॉलम का उपयोग कर सकती है।

आपने बताया कि एक गणना कॉलम का उपयोग करने के लिए आपकी प्रेरणा प्रदर्शन को बढ़ाने के लिए थी। restrictions के बहुत सारे हैं लेकिन indexed view यहां मूल्य जोड़ सकते हैं।

+0

ओह, वह हिस्सा याद किया। –

47

मैं इस सवाल का जवाब दो साल देर से आता है पता है, लेकिन सिर्फ किसी को जो googles और इस पोस्ट पाता है मदद करने के लिए:

यह एक उपयोगकर्ता परिभाषित समारोह को परिभाषित करने और परिकलित मान के रूप में उपयोग करने के लिए पूरी तरह से कानूनी है। इस फ़ंक्शन में अन्य तालिकाओं से चयन कथन शामिल हो सकते हैं।

CREATE FUNCTION dbo.getSumAdViews(@packageId int) 
RETURNS int 
AS 
BEGIN 
    DECLARE @r int 
    select @r = SUM(BaseAdViews) from Packages where PackageId = @packageId 
    RETURN @r 
END 

फिर अपने गणना स्तंभ में, बस अभिव्यक्ति dbo.getSumAdViews(PackageId)

+0

प्रदर्शन के संदर्भ में सीधे शामिल होने के साथ इस दृष्टिकोण की तुलना कैसे की जाती है? – liang

+2

सच है, बस ध्यान दें कि यदि आप गणना किए गए कॉलम को जारी रखना चाहते हैं तो यह काम नहीं करेगा। –

+0

@liang: [sqlcat] (के अनुसार https://blogs.msdn.microsoft.com/sqlcat/2011/11/28/a-computed-column-defined-with-a-user-defined-function-might- प्रभाव-क्वेरी-प्रदर्शन /), एसक्यूएल एक गणना किए गए यूडीएफ कॉलम का उपयोग करने वाले प्रश्नों को समानांतर करने से इंकार कर देता है। [एरिक डार्लिंग] (https://www.brentozar.com/archive/2016/01/another-reason-why-scalar-functions-in-computed-columns-is-a-bad-idea/) के अनुसार, कि इसका अर्थ यह भी है कि 'डीबीसीसी CHECKDBB' स्क्रिप्ट समानांतर करने से इंकार कर देगी (जो कि अगर आप एंटरप्राइज़ संस्करण पर नहीं हैं तो यह म्यूट है)। – Brian

0

अगर यह प्रदर्शन प्रयोजनों के लिए ही है का उपयोग करें, क्यों एक दृश्य नहीं बनाया ..

select <<add other columns you need>> mediaspend+basicadviews as totaladviews 
from 
orders o 
join 
packages p 
on p.packageid=o.orderid 
संबंधित मुद्दे