CTE

6

का उपयोग करके SQL विवरण को आसान बनाने में मैं निम्नलिखित की तरह एक प्रश्न:CTE

SELECT A.a, A.b, B.c, 
(CASE WHEN ... THEN ... ELSE ... END) AS CalculatedValue, 
B.d 
FROM dbo.TableA A INNER JOIN 
     dbo.TableB B ON (...) 
WHERE (CASE WHEN ... THEN ... ELSE ... END) BETWEEN @DayStart AND @DayEnd 
GROUP BY A.a, (CASE WHEN ... THEN ... ELSE ... END), B.c 

कई बार ठीक उसी अभिव्यक्ति दोहरा से बचने के लिए: (CASE WHEN ... THEN ... ELSE ... END) मैं चयन में एक CTE और क्वेरी जैसे तालिका का उपयोग कर परिभाषित करने के लिए चाहता था, जहां और समूह अभिव्यक्ति CalculatedValue

द्वारा दुर्भाग्य से यह काम नहीं करता क्योंकि चयन की जरूरत पहले से ही शामिल करने के लिए group by जब CTE

बनाने वहाँ किसी भी दूसरी तरफ मैं CASE WHEN... को कई बार दोहराने के लिए उपयोग नहीं कर सकता था?

उत्तर

7

उपयोग CROSS APPLY, जो aliased क्षेत्रों को परिभाषित करने और फिर उन्हें का उल्लेख किया जा सकता है:

SELECT A.a, 
     A.b, 
     B.c, 
     CalculatedValue, 
     B.d 
FROM  
     dbo.TableA A 
INNER JOIN 
     dbo.TableB B 
     ON (...) 
CROSS APPLY 
     (SELECT (CASE WHEN ... THEN ... ELSE ... END)) CxA(CalculatedValue) 
WHERE CalculatedValue BETWEEN @DayStart AND @DayEnd 
GROUP BY A.a, CalculatedValue, B.c 

CxA सिर्फ एक उपनाम है और आप इसे नाम कर सकते हैं जो कुछ भी आप की तरह।

+0

धन्यवाद जेएनके, इसने समस्या को हल किया, उसी निष्पादन का समय, पहले से पहले क्लीनर कोड, +1 और हरा ध्वज ;-) –

+0

मदद करने में खुशी! मैंने हाल ही में इस बारे में सीखा है और इसने बहुत सी चीजों को सरल बना दिया है। – JNK

+0

तालिका मूल्यवान कार्यों में सामान्य तर्क को समाहित करते समय यह वास्तव में मजेदार हो जाता है। प्रश्नों को 'टेबल क्रॉस आवेदन udf1 क्रॉस लागू करने के लिए udf2 क्रॉस लागू udf3' पढ़ना समाप्त हो सकता है और सभी' सामान्य 'एसक्यूएल छिपा हुआ है! – MatBailie

0

उपरोक्त के लिए, मुझे लगता है कि आप केवल सीटीई की दो परतें कर सकते हैं। पहला सभी के लिए गणना करेगा, दूसरा पहले सीटीई से चयन करेगा और गणना मूल्य के आधार पर फ़िल्टर करेगा। अंतिम क्वेरी दूसरी परत सीटीई में शामिल होगी।

बस एक विचार।