क्या हम एकल sql - Oracle SQL में कई "AS के साथ" हो सकते हैं


102

मेरे पास एक बहुत ही सरल प्रश्न था: क्या एक एकल sql कथन में oracle एकाधिक "AS के साथ" की अनुमति देता है।

उदाहरण:

WITH abc AS( select ......)

WITH XYZ AS(select ....) /*This one uses "abc" multiple times*/

Select ....   /*using XYZ multiple times*/

मैं एक ही क्वेरी को कई बार दोहराकर क्वेरी का काम कर सकता हूं, लेकिन ऐसा नहीं करना चाहता, और "एएस के साथ" का लाभ उठाएं। यह एक साधारण आवश्यकता की तरह लगता है लेकिन ऑरेकल मुझे अनुमति नहीं देता है:

ORA-00928: चयनित कीवर्ड गुम है

जवाबों:


190

आप यह कर सकते हैं:

WITH abc AS( select
             FROM ...)
, XYZ AS(select
         From abc ....) /*This one uses "abc" multiple times*/
  Select 
  From XYZ....   /*using abc, XYZ multiple times*/

2
क्या हम पहले उप-वर्ग से दूसरे उप-वर्ग में उपनाम का उपयोग कर सकते हैं? इस मामले में abcऔर xyzउपश्रेणियाँ? मुझे पहले उपश्रेणी का परिणाम प्राप्त करने की आवश्यकता है और दूसरी उपश्रेणी पर इसका उपयोग करने की।
वैक्स

@Wax मैं दूसरे उपश्रेणी में प्रथम उपचुनाव से लेकर किसी भी समस्या के साथ उपनाम का उपयोग करने में सक्षम हूं, जैसा कि ऊपर दिए गए उत्तर में दिया गया है। मैं मुख्य क्वेरी में दोनों तालिकाओं से उपनाम और स्तंभों का उपयोग करने में सक्षम था।
क्लेबरज

एकदम सही जवाब।
InfiniteFlash

29

सही सिंटैक्स है -

with t1
as
(select * from tab1
where conditions...
),
t2
as
(select * from tab2
where conditions...
(you can access columns of t1 here as well)
)
select * from t1, t2
where t1.col1=t2.col2;

5
"आप यहाँ पर t1 के कॉलम तक पहुँच सकते हैं" यह इंगित करने के लिए बहुत उपयोगी था।
ब्रेन

10

हाँ तुम कर सकते हो...

WITH SET1 AS (SELECT SYSDATE FROM DUAL), -- SET1 initialised
     SET2 AS (SELECT * FROM SET1)        -- SET1 accessed
SELECT * FROM SET2;                      -- SET2 projected

10/29/2013 10:43:26 AM

उस आदेश का पालन करें जिसमें इसे कॉमन टेबल एक्सप्रेशंस में इनिशियलाइज़ किया जाना चाहिए


3

आदित्य या अन्य, क्या आप अपने उदाहरण में t1 के साथ t2 से जुड़ सकते हैं या मेल कर सकते हैं, अर्थात मेरे कोड में अनुवादित,

with t1 as (select * from AA where FIRSTNAME like 'Kermit'),
     t2 as (select * from BB B join t1 on t1.FIELD1 = B.FIELD1)

मुझे यह स्पष्ट नहीं है कि जुड़ने के लिए केवल WHERE का समर्थन किया जाता है या 2 वें एंटिटी के साथ कौन-सा जुड़ने वाला दृष्टिकोण समर्थित है। कुछ उदाहरणों में क्लॉज़ के साथ "नीचे" के शरीर में WHERE A = B है।

घोषणाओं के बाद मुझे जो त्रुटि हो रही है, वह बी के पहचानकर्ता (क्षेत्र के नाम) को मान्यता नहीं है, नीचे के बाकी एसक्यूएल के शरीर में। तो सिंटैक्स के साथ ठीक चलने के लिए लगता है, लेकिन t2 से परिणाम तक नहीं पहुँच सकते।


आपको क्लॉज़ के साथ टी 2 के भीतर एलिया टी 1 की आवश्यकता है
बेन

मैं उप क्वेरी के अंदर क्लाज टेबल के साथ कैसे संदर्भ ले सकता हूं? यह एक त्रुटि है। उदाहरण के लिए, SET1 AS (SELECT SYSDATE FROM DUAL) के साथ, - SET1 आरंभिक SET2 AS (SELECT * FET SET1) - SET1 ने SELECT * से SET2 LEFT OST JOIN (SET1 से चयन करें * जहाँ sysdate = now ()) set3 पर सेट 3 को एक्सेस किया। set1.sysdate = set3.sysdate;
रूपा सुषमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.