sql - संदर्भ में "AMOUNT1" मान्य नहीं है, जहां यह उपयोग किया जाता है




db2 (4)

इस विषय के बाद से उत्तर दिया गया था, और मेरा पहला उदाहरण एक डुप्लिकेट है [लेकिन अलग ढंग से स्वरूपित]; वहाँ मूल्य के कुछ हो सकता है / मैं क्या पेशकश में जोड़ें।

SELECT column-list पर एक अभिव्यक्ति के लिए निर्दिष्ट नाम इसी खोज क्वेरी के प्रत्येक अन्य खंड के दायरे के भीतर संदर्भ के लिए उपलब्ध नहीं है; जैसे कि वहां निर्दिष्ट नाम, एक आदेश के तहत खंड में संदर्भ के लिए उपलब्ध है, लेकिन या तो एक WHERE खंड या HAVING खंड में संदर्भ नहीं किया जा सकता - इस प्रकार, त्रुटि को बताते हुए दिखाया गया है।

HAVING खंड में अभिव्यक्ति दोहराए जाने से बचने के लिए [नोट: कुल मिलाकर एक WHERE खंड में अनुमति नहीं दी जाती है, जब तक कि स्केलर सबसेलेक्ट के रूप में नहीं लिखा जाता है], व्युत्पन्न तालिका अभिव्यक्ति के भीतर अभिव्यक्ति के परिणाम के लिए एक नाम निर्दिष्ट करने पर विचार करें ; जो कि व्युत्पन्न तालिका की क्वेरी में नाम को स्कॉप करना सक्षम बनाता है। एक डुप्लिकेट अभिव्यक्ति के संदर्भ को नष्ट करने से, यह भी दो प्रतियों को समान रूप से बनाए रखने से रोकता है, यदि कोई संशोधन क्वेरी के लिए किए जाने की आवश्यकता है।

तालिका पहचानकर्ता और यहां दिखाए गए योग्य कॉलम नाम का उपयोग, दोनों वैकल्पिक हैं, लेकिन यह स्पष्ट है कि संदर्भित नाम कहां से आता है; उदाहरण नामित अभिव्यक्ति को संदर्भित करने के लिए व्युत्पन्न तालिका को कोड के दो तरीके दिखाते हैं।

select S.AMOUNT1
from table /* Nested Table Expression (NTE) */
  ( select 
      SUM ( orders.totalproduct
          + orders.TOTALTAX
          + orders.totalshipping
          - orders.totaladjustment
          ) as amount1 
    from orders
  ) as S
where S.amount1>10000

with /* Common Table Expression (CTE) */
  aggSum ( AMOUNT1 ) as
    ( select 
         SUM ( orders.totalproduct
             + orders.TOTALTAX
             + orders.totalshipping
             - orders.totaladjustment
             ) as amount1 /* named here; or, as shown, named above */
      from orders
    )
select C.AMOUNT1
from aggSum as C /* from the above (CTE) */
where C.amount1>10000

यद्यपि निम्नलिखित विकल्प भी है [मुझे संदेह है कि मैं कभी भी कोड लिखूंगा, क्योंकि], मुझे पढ़ने के लिए और अधिक मुश्किल यह है कि आपने हाविंग खंड में अभिव्यक्ति के दोहरे संदर्भों की तुलना में पढ़ा है [यानी दूसरे उदाहरण में दिखाया गया है स्वीकृत उत्तर में] यह क्वेरी एक सबक्व्यूरी में समान समवर्ती क्वेरी को एन्कॉलेट करता है, क्योंकि उसके बाद WHERE क्लॉज़ पर स्केलर सबसेल के रूप में संदर्भित किया गया है:

  select 
    SUM ( orders.totalproduct
        + orders.TOTALTAX
        + orders.totalshipping
        - orders.totaladjustment
        ) as amount1 
  from orders
  where ( select 
            SUM ( orders.totalproduct
                + orders.TOTALTAX
                + orders.totalshipping
                - orders.totaladjustment
                )
          from orders
        ) > 10000

मैं डीबी 2 में निम्नलिखित प्रश्न निष्पादित कर रहा हूं:

select  
  SUM (orders.totalproduct
      +orders.TOTALTAX
      +orders.totalshipping
      -orders.totaladjustment) as amount1 
from 
  orders  
where 
  amount1>10000

क्वेरी निष्पादित नहीं की गई है, मुझे इसके बजाय यह अपवाद मिलता है:

"AMOUNT1" संदर्भ में मान्य नहीं है, जहां यह उपयोग किया जाता है .. SQLCODE = -206, SQLSTATE = 42703, ड्रायवर = 3.64.96 SQL कोड: -206, SQL राज्य: 42703

मैं क्या गलत कर रहा हूं?


आप DB2 में एक ही समय में राशि 1 का निर्माण और उपयोग नहीं कर सकते।

इसे इस्तेमाल करे:

 select * from (
 select SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping- orders.totaladjustment) as amount1 from orders 
 ) tmp where amount1>10000

या यह:

select SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping-  orders.totaladjustment) as amount1 from orders 
having  SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping-orders.totaladjustment)>10000

डीबी 2 में, आप अपने कॉलम के लिए एक उप-उपनाम में बनाये गये उपनाम का उपयोग नहीं कर सकते हैं जहां / होने के कारण।

यहां तक ​​कि MySQL / BigQuery में भी, मैं समझता हूं कि आप समूह में किसी भी उपनाम द्वारा / आदेशों के अनुसार / किसी भी उपनाम को संदर्भित कर सकते हैं, न कि कहां

उप क्वेरी का उपयोग करें और वहां फ़िल्टर करें, या कॉलम के लिए कोड को कॉपी करें (उपनाम के बिना) और उसमें पेस्ट करें लेकिन उप क्वेरी विकल्प की सिफारिश करेंगे।


ओरेकल के साथ समर्थन करता है।

यह इस तरह दिखेगा।

WITH emps as (SELECT * FROM Employees)
SELECT * FROM emps WHERE ID < 20
UNION ALL
SELECT * FROM emps where Sex = 'F'

@ysth के साथ Google को मुश्किल है क्योंकि यह आमतौर पर खोजों से अलग एक आम शब्द है।

सबक्वायरी फैक्टरिंग कैसे काम करती है यह देखने के लिए आप SELECT दस्तावेज़ों को देखना चाहते हैं।

मुझे पता है कि यह ओपी का जवाब नहीं देता है लेकिन मैं किसी भी भ्रम की सफाई कर रहा हूं या नहीं।





sql db2