SQL सर्वर - अपडेट स्टेटमेंट में विंडो फ़ंक्शंस की अनुमति क्यों नहीं है?


10

अपडेट स्टेटमेंट को चलाते समय, जैसे नीचे दिया गया, मुझे एक त्रुटि मिलती है जो मुझे बता रही है

विंडो किए गए फ़ंक्शन केवल SELECT या ORDER BY क्लॉस में दिखाई दे सकते हैं।

UPDATE dbo.Dim_Chart_of_Account
SET Account_Order = LAG([Account_Order]) OVER (ORDER BY [Account_SKey])

मुझे पता है कि यह नीचे की तरह एक updatable cte का उपयोग करके आसानी से काम किया जा सकता है

 WITH my_cte AS (
     SELECT [Account_Order], LAG([Account_Order]) OVER (ORDER BY [Account_SKey]) AS acc_order_lag
     FROM Dim_Chart_of_Account
)
UPDATE my_cte
SET [Account_Order] = acc_order_lag

मेरा सवाल यह है कि क्या कोई कारण है कि इसे अपडेट स्टेटमेंट में अनुमति नहीं दी जाती है, क्या मुझे वर्कअराउंड के रूप में अपग्रेडेबल सीटी का उपयोग करने से बचना चाहिए?

मेरी चिंता यह है कि अपडेट स्टेटमेंट्स के साथ विंडो फ़ंक्शंस का उपयोग करते समय समस्याएँ होती हैं और इसलिए मैं यह समझना चाहता हूं कि क्या यह एक स्वीकार्य तरीका है या इसे टाला जाना चाहिए।


1
अद्यतन योग्य CTE स्वीकार्य और ठीक है। पता नहीं क्यों इसे UPDATE में अनुमति नहीं है।
ypercube y

2
शायद Hallowe'en किसी तरह का संरक्षण?
हारून बर्ट्रेंड

जवाबों:


5

UPDATE कथनों में विंडो फ़ंक्शंस की अनुमति नहीं है क्योंकि UPDATE SELECT या ORDER BY के साथ संगत नहीं है।

विंडो फ़ंक्शंस स्कॉप्ड सेलेक्ट स्टेटमेंट की तरह हैं जो संबंधित पंक्तियों की फिर से जाँच करते हैं और पार्टिशन बाय और ओर्डर्ड बाय जैसी शर्तों को लागू करते हैं। इसके अलावा, कई विंडो फ़ंक्शंस के लिए ORDER BY क्लॉज़ (ROW_NUMBER, LAG और FIRST_VALUE, उदाहरण के लिए) की आवश्यकता होती है।

अद्यतन स्टेटमेंट SELECT के बजाय SET का उपयोग करते हैं, इसलिए उसी क्वेरी स्तर में कहीं भी SELECT की अनुमति नहीं है। अद्यतन के साथ आने वाला कोई भी चयन एक उपश्रेणी में समाहित होना चाहिए।

आदेश को अस्वीकार करने से समझ में आता है कि अद्यतन विवरण उस आदेश के प्रति उदासीन है जिसमें वह पंक्तियों को अद्यतन करता है।

विंडो फ़ंक्शन का उपयोग करने के लिए UPDATE प्राप्त करने के लिए वर्कअराउंड के रूप में CTE या अन्य सबक्वेरी का उपयोग करने के लिए कोई अंतर्निहित पहलू नहीं है। यह इटज़िक बेन-गण जैसे टी-एसक्यूएल विशेषज्ञों द्वारा की जाने वाली सामान्य प्रथा है। (उनकी पुस्तक का पृष्ठ 29 देखें, Microsoft SQL Server 2012 हाई-परफॉर्मेंस T-SQL विंडो फ़ंक्शंस का उपयोग करते हुए जहां वह इस सटीक परिदृश्य को शामिल करता है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.