2013-02-21 18 views
5

मैं तीन टेबल है में शामिल होने के बाहरी छोड़ दिया नीचे दिखाया गया है जैसे:ओरेकल में तीन टेबल

enter image description here

और मैं नीचे की तरह उत्पादन प्राप्त करने के लिए कोशिश कर रहा हूँ:

enter image description here

यहाँ क्या है मैं अब तक कोशिश की है

SELECT table1.tb1_a, 
CASE WHEN table3.tb3_a IS NOT NULL THEN 
    tb3_b 
    ELSE 'No city for him yet' 
END AS 'City' 
FROM table1 
LEFT OUTER JOIN table2 ON 
    table1.tb1_a = table2.tb2_a 
LEFT OUTER JOIN table3 ON 
    table2.tb2_a = table3.tb3_a 
WHERE table3.tb3_a IN 
    (

    ) 

और अब मैं कैसे tb3_a स्तंभ का अधिकतम मान का चयन करने पर संघर्ष कर रहा हूँ

+0

मुझे लगता है कि लोगों को यहां भ्रमित हो सकते हैं है मुझे लगता है कि आप वास्तव में 'tb2_b' का अधिकतम मान चाहते हैं और फिर उसमें 'tb3_a' से जुड़ें। – ninesided

+0

मुझे लगता है कि आपके वर्तमान प्रयास में कोई गलती है। आप tb3_a के साथ tb2_a की तुलना करें। ऐसा लगता है कि आपको tb3_b के साथ tb2_b की तुलना करनी चाहिए। –

+0

@ वाल्टर - आप – ninesided

उत्तर

2

यह आपको क्या चाहिए करना चाहिए:

SELECT t1.tb1_a, COALESCE(t3.tb3_a, 'No city for him yet') AS City 
FROM table1 t1 
LEFT JOIN (
    SELECT MAX(tb2_b) AS tb2_b, tb2_a 
    FROM table2 
    GROUP BY tb2_a 
) t2 ON (t2.tb2_a = t1.tb1_a) 
LEFT JOIN table3 t3 ON (t3.tb3_a = t3.tb2_b); 

प्रमुख मुद्दा बीच में इन-लाइन दृश्य जहां हम आभासी का एक प्रकार बनाने है तालिका जिसमें प्रत्येक tb2_a के लिए अधिकतम tb2_b मान शामिल है। वांछित परिणाम प्राप्त करने के लिए हम इसमें शामिल हो सकते हैं।

+0

हाय, उत्तर के लिए और आपके समय के लिए बहुत बहुत धन्यवाद .. – javanoob

+0

@javanoob - आपका स्वागत है – ninesided

1

कुछ इस तरह

select tb1_a, nvl(max(city), 'no city for him yet') thecity 
from etc 
group by tbl_a 
1

काम करना चाहिए मुझे लगता है कि आप विश्लेषणात्मक कार्यों के साथ ऐसा करना चाहते हैं।

SELECT tb1_a, coalesce(tb3_b, 'No city for him yet') as City 
from (select table1.tb1_a, tb3_b, 
      ROW_NUMBER() over (partition by table1.tbl1_a order by tb3_a desc) as seqnum 
     FROM table1 LEFT OUTER JOIN 
      table2 
      ON table1.tb1_a = table2.tb2_a LEFT OUTER JOIN 
      table3 
      ON table2.tb2_a = table3.tb3_a 
    ) t 
where seqnum = 1 

यह row_number() का उपयोग करता table3 में अंतिम प्रविष्टि निर्धारित करने के लिए: यहां बताया गया है। यह where seqnum = 1 खंड द्वारा चुना जाता है।

+0

से नीचे मेरा उदाहरण देख रहे हैं धन्यवाद यह – javanoob

0

इस कोशिश, आशा है कि आप मदद

with table_1 as 
(select 10 as tb1_a, 'John' as tb1_b 
    from dual 
    union all 
    select 20 as tb1_a, 'John1' as tb1_b 
    from dual 
    union all 
    select 30 as tb1_a, 'John2' as tb1_b from dual), 
table_2 as 
(select 10 as tb2_a, 100 as tb2_b 
    from dual 
    union all 
    select 10 as tb2_a, 1000 as tb2_b 
    from dual 
    union all 
    select 10 as tb2_a, 10000 as tb2_b 
    from dual 
    union all 
    select 20 as tb2_a, 200 as tb2_b 
    from dual 
    union all 
    select 20 as tb2_a, 2000 as tb2_b 
    from dual 
    union all 
    select 20 as tb2_a, 20000 as tb2_b from dual), 
table_3 as 
(select 100 as tb3_a, 'City1' as tb3_b 
    from dual 
    union all 
    select 1000 as tb3_a, 'City10' as tb3_b 
    from dual 
    union all 
    select 10000 as tb3_a, 'City100' as tb3_b 
    from dual 
    union all 
    select 200 as tb3_a, 'City2' as tb3_b 
    from dual 
    union all 
    select 2000 as tb3_a, 'City20' as tb3_b 
    from dual 
    union all 
    select 20000 as tb3_a, 'City200' as tb3_b from dual) 

select user_id, city 
    from (select u.tb1_a as user_id, 
       nvl(c.tb3_b, 'No city') as city, 
       rank() over(partition by u.tb1_a order by tb3_a) as city_rank 
      from table_1 u, table_2 u_c, table_3 c 
     where u.tb1_a = u_c.tb2_a(+) 
      and u_c.tb2_b = c.tb3_a(+)) t1 
where city_rank = 1 
1

यह काम करता है:

http://sqlfiddle.com/#!4/7ba1c/12

SELECT table1.tb1_a, 
     CASE WHEN table3.tb3_a IS NOT NULL THEN tb3_b 
      ELSE 'No city for him yet' 
     END AS City, 
table2.*, table3.* 
FROM table1 
LEFT OUTER JOIN table2 ON table1.tb1_a = table2.tb2_a 
LEFT OUTER JOIN table3 ON table2.tb2_b = table3.tb3_a 
where tb2_b = (select max(tb2_b) 
       from table2 t22 
       where t22.tb2_a = tb1_a) 
or tb2_b is null 
order by 1 

मुझे लगता है कि जहां खंड ही बताते हैं

+0

यह आश्चर्यजनक है .. मैं समझ गया कि मैं कहां हूं जल्दी से गलत कर रहा था .. टेबल और सब कुछ sqlfiddle पर तैयार करने के लिए एक टन धन्यवाद। – javanoob

+0

@ जुआर्जन, जबकि आपकी क्वेरी सही परिणाम लौटा सकती है, 'WHERE' खंड में एक सहसंबंधित सबक्वायरी होने पर बहुत महंगा हो सकता है क्योंकि परिणाम सेट द्वारा लौटाई गई प्रत्येक पंक्ति के लिए सबक्वायरी को निष्पादित किया जाना चाहिए। – ninesided

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