2011-07-28 22 views
21

मेरे पास बहुत सारे गणना किए गए कॉलम हैं और वे स्वयं को दोबारा बनाते हैं, दूसरों के अंदर एक, नेस्टेड केस स्टेटमेंट्स सहित।एसक्यूएल कथन को डुप्लिकेट करने से परहेज किए गए गणना कॉलम का पुन: उपयोग कैसे करें?

है कि मैं इसके लिए कोई तरीका खोज लिया है कुछ का एक बहुत सरलीकृत संस्करण है।

SELECT 
    (1+2) AS A, 
    A + 3 AS B, 
    B * 7 AS C 
FROM MYTABLE 

अग्रिम धन्यवाद।

उत्तर

16

आप कुछ इस तरह की कोशिश कर सकते:

या आप गणना के परिणाम, तालिका में कॉलम के रूप में दिखाई तो एक गणना स्तंभ उपयोग करना चाहते हैं।

SELECT 
    A.Val AS A, 
    B.Val AS B, 
    C.Val AS C 
FROM MYTABLE 
    cross apply(select 1 + 2) as A(Val) 
    cross apply(select A.Val + 3) as B(Val) 
    cross apply(select B.Val * 7) as C(Val) 
+0

इस नेस्टेड मामलों और/एक मिलती है या का उपयोग किया जा सकता है? –

+0

@Eduardo सुनिश्चित नहीं है कि आपका क्या मतलब है। कृपया कुछ नमूना प्रश्नों के साथ प्रश्न दोहराएं जिन्हें आप निकालना चाहते हैं और मैं या कोई और इसे देख सकता हूं। –

1

आपकी गणना के परिणामों को "सहेजने" का एकमात्र तरीका एक सबक्वायरी में उनका उपयोग करेगा, इस तरह आप A, B and C का उपयोग कर सकते हैं। दुर्भाग्य से यह किसी अन्य तरीके से नहीं किया जा सकता है।

1

आप मूल्यों आप चाहते हैं का प्रतिनिधित्व करने के computed columns बना सकते हैं। साथ ही, यदि आप एक अलग तालिका में डेटा पर निर्भर हैं तो आप view का उपयोग कर सकते हैं।

0

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

CREATE TABLE Test(
    ID INT NOT NULL IDENTITY(1,1), 
    TimesTen AS ID * 10 
) 
6

आप बाद में अपने कॉलम उपनामों का संदर्भ देकर केवल निर्मित अभिव्यक्तियों का संदर्भ नहीं दे सकते। संपूर्ण चयन सूची को एक ही समय में या यादृच्छिक क्रम में भौतिक रूप से प्रस्तुत करने के बारे में सोचें - जब तक आप बी बनाने के लिए अभिव्यक्ति करने की कोशिश नहीं कर रहे हैं तब तक अस्तित्व में नहीं है। आपको अभिव्यक्ति दोहराने की आवश्यकता है - मुझे नहीं लगता 'उन्हें दोहराए बिना "सरल" गणना कॉलम बना कर सकेंगे, और एक ही विचार - आप की तरह घोंसला बातें करने के लिए है, होगी:

SELECT A, B, C = B * 7 
FROM 
(
    SELECT A, B = A + 3 
    FROM 
    (
    SELECT A = (1 + 2) 
) AS x 
) AS y; 

या अभिव्यक्ति दोहराने (लेकिन मुझे लगता है कि यह है कि आप क्या है' से बचने की कोशिश कर रहे हैं)।

4

एक अन्य विकल्प अगर किसी को अभी भी रुचि है:

with aa(a) as (select 1+2) 
, bb(b) as (select a+3 from aa) 
,cc(c) as (select b*7 from bb) 
SELECT aa.a, bb.b, cc.c 
from aa,bb,cc 
संबंधित मुद्दे

 संबंधित मुद्दे