2012-04-10 9 views
5

में संदर्भ पैरेंट क्वेरी कॉलम ओरेकल का उपयोग करके एक सबक्वायरी के बाहर एक कॉलम का संदर्भ कैसे दे सकता हूं? मुझे विशेष रूप से सबक्वायरी के WHERE कथन में इसका उपयोग करने की आवश्यकता है।सबक्वायरी (ओरेकल)

SELECT Item.ItemNo, Item.Group 
FROM Item 
    LEFT OUTER JOIN (SELECT Attribute.Group, COUNT(1) CT 
        FROM Attribute 
        WHERE Attribute.ItemNo=12345) A ON A.Group = Item.Group 
WHERE Item.ItemNo=12345 

मैं सबक्वेरी में WHERE Attribute.ItemNo=Item.ItemNo को WHERE Attribute.ItemNo=12345 बदलना चाहते हैं, लेकिन मैं समझ नहीं करता है, तो यह संभव है:

मूल रूप से मैं इस किया है। मैं बार आ रही है "ORA-00904: 'आइटम' 'ItemNo':। अमान्य पहचानकर्ता"

संपादित करें:

मैं चाहता हूँ:

ठीक है, इस कारण है कि मैं संरचना इस तरह की जरूरत है "त्रुटि" रिकॉर्ड्स (जहां आइटम में कोई मूल्य गुम है) और "ठीक" रिकॉर्ड (जहां आइटम का मान है) की गिनती प्राप्त करने में सक्षम हो।

जिस तरह से मैंने इसे पहेली में सेट किया है, वह सही डेटा देता है। मुझे लगता है कि मैं बस सबकुछरी में मूल्य भरना समाप्त कर सकता हूं, क्योंकि यह शायद सबसे आसान तरीका होगा। क्षमा करें अगर मेरी डेटा संरचनाएं थोड़ी गड़बड़ी कर रही हैं। यदि आवश्यकता हो तो मैं समझा सकता हूं।

मेरे तालिकाओं हैं:

create table itemcountry(
    itemno number, 
    country nchar(3), 
    imgroup varchar2(10), 
    imtariff varchar2(20), 
    exgroup varchar2(10), 
    extariff varchar2(20)); 

create table itemattribute(
    attributeid varchar2(10), 
    tariffgroup varchar2(10), 
    tariffno varchar2(10)); 

create table icav(
    itemno number, 
    attributeid varchar2(10), 
    value varchar2(10)); 

और मेरी क्वेरी अब तक है:

select itemno, country, imgroup, imtariff, im.error "imerror", im.ok "imok", exgroup, extariff, ex.error "exerror", ex.ok "exok" 
from itemcountry 
    left outer join (select sum(case when icav.itemno is null then 1 else 0 end) error, sum(case when icav.itemno is not null then 1 else 0 end) ok, tariffgroup, tariffno 
        from itemattribute ia 
        left outer join icav on ia.attributeid=icav.attributeid 
        where (icav.itemno=12345 or icav.itemno is null) 
        group by tariffgroup, tariffno) im on im.tariffgroup=imgroup and imtariff=im.tariffno 
    left outer join (select sum(case when icav.itemno is null then 1 else 0 end) error, sum(case when icav.itemno is not null then 1 else 0 end) ok, tariffgroup, tariffno 
        from itemattribute ia 
        left outer join icav on ia.attributeid=icav.attributeid 
        where (icav.itemno=12345 or icav.itemno is null) 
        group by tariffgroup, tariffno) ex on ex.tariffgroup=exgroup and extariff=ex.tariffno 
where itemno=12345; 

यह भी एक SQL Fiddle में स्थापित किया है।

+0

आप नहीं कर सकते .. आप क्या चुनना चाहते हैं? बाएं बाहरी जुड़ने के अलावा अन्य समाधान हो सकता है। – hkutluay

+0

sqlfiddle – tedski

उत्तर

0

आप इसे उप-प्रश्न में कर सकते हैं लेकिन इसमें शामिल नहीं हो सकते हैं। आपके मामले में मुझे कोई ज़रूरत नहीं है। आप इसे शामिल स्थिति में डाल सकते हैं।

select i.itemno, i.group 
    from item i 
    left outer join (select group, itemno 
         from attribute b 
        group by group itemno) a 
    on a.group = i.group 
    and i.itemno = a.itemno 
where i.itemno = 12345 

अनुकूलक इस तरह की स्थिति से निपटने के लिए बनाया गया है ताकि इसका उपयोग किया जा सके!

मैंने count(1) को group by में बदल दिया है क्योंकि आपको group by सभी स्तंभों को एकत्रित नहीं किया गया है।

मैं यह सोचते हैं रहा है कि अपने वास्तविक क्वेरी अधिक शायद

select itemno, group 
    from item 
where itemno = 12345 

के बराबर है, तो आप के बजाय एक analytic function के साथ अपने उप क्वेरी लिख सकता कॉलम आप इस चयन किए जाने वाले के साथ के रूप में इस की तुलना में जटिल है। कुछ count(*) over (partition by group) की तरह।

एक कॉलम नाम के रूप में एक कीवर्ड का उपयोग करते हुए, इस मामले में group एक खराब विचार टीएम है। यह बहुत भ्रम पैदा कर सकता है। जैसा कि आप ऊपर दिए गए कोड से देख सकते हैं, वहां आपके पास बहुत सारे groups हैं।


तो, अपने एसक्यूएल-फिडल, जो मैं सवाल मुझे लगता है कि आप निम्नलिखित है, जो ज्यादा बेहतर नहीं लगती है की तरह कुछ के लिए देख रहे करने के लिए जोड़ दिया है पर आधारित है।मुझे संदेह है, समय दिया गया है, मैं इसे आसान बना सकता हूं। दूसरी तरफ ध्यान दें कि स्पष्ट रूप से कम आवरण प्रश्नों का कारण कभी भी परेशानी के लायक नहीं है। हालांकि मैंने आपके नामकरण सम्मेलन का पालन किया है।

with sub_query as (
select count(*) - count(icav.itemno) as error 
     , count(icav.itemno) as ok 
     , min(itemno) over() as itemno 
     , tariffgroup 
     , tariffno 
    from itemattribute ia 
    left outer join icav 
    on ia.attributeid = icav.attributeid 
    group by icav.itemno 
     , tariffgroup 
     , tariffno 
) 
    select ic.itemno, ic.country, ic.imgroup, ic.imtariff 
     , sum(im.error) as "imerror", sum(im.ok) as "imok" 
     , ic.exgroup, ic.extariff 
     , sum(ex.error) as "exerror", sum(ex.ok) as "exok" 
     from itemcountry ic 
     left outer join sub_query im 
     on ic.imgroup = im.tariffgroup 
     and ic.imtariff = im.tariffno 
     and ic.itemno = im.itemno 
     left outer join sub_query ex 
     on ic.exgroup = ex.tariffgroup 
     and ic.extariff = ex.tariffno 
     and ic.itemno = ex.itemno 
    where ic.itemno = 12345 
    group by ic.itemno, ic.country 
      , ic.imgroup, ic.imtariff 
      , ic.exgroup, ic.extariff 
      ; 
+0

धन्यवाद, मैं उन विश्लेषणात्मक कार्यों को देखूंगा। आप सही हैं, मैं जितना संभव हो सके उदाहरण को फिर से बनाने की कोशिश कर रहा था। मेरे अंतिम लक्ष्य का एक बेहतर प्रतिनिधित्व एसक्यूफ्लिड में है जिसे मैंने संपादित में जोड़ा था। – tedski

+0

@tedski, मेरा जवाब अभी भी खड़ा है! एक कम जटिल उदाहरण का उपयोग मानक अभ्यास है, यह सभी के लिए जीवन आसान बनाता है। आप अभी भी अपनी हालत में शामिल हो सकते हैं ... – Ben

+0

क्षमा करें, मेरा उदाहरण मेरी समस्या को सही तरीके से कैप्चर नहीं करता है। सबक्वायरी में एक और टेबल शामिल हो रही है और वास्तव में दो मायने रखती हैं। मेरे पास एक गिनती है जब शामिल तालिका में आइटम शून्य है और जब यह नहीं है। अगर मैंने आइटम नंबर जोड़ा है, तो यह एक के बजाय दो कॉलम थूक देगा। – tedski

-4

आप subquery के अंदर WHERE विशेषता.itemno = item.itemno डाल सकते हैं। आप वैसे भी डेटा फ़िल्टर करने जा रहे हैं, सबक्वायरी के अंदर डेटा फ़िल्टर करना आमतौर पर तेज़ होता है।

+0

देखें मैं नहीं कर सकता ... अंतिम अनुच्छेद पढ़ें। – tedski

+0

ओपी ने संकेत दिया है कि यह प्रश्न में काम नहीं करता है। – Ben