Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

बाएं बाहरी जॉइन की पहली पंक्ति प्राप्त करना

कोशिश करें DENSE_RANK रखें

डेटा स्रोत:

CREATE TABLE person
    (person_id int primary key, firstname varchar2(4), lastname varchar2(9))
/
INSERT ALL
    INTO person (person_id, firstname, lastname)
         VALUES (1, 'john', 'lennon')
    INTO person (person_id, firstname, lastname)
         VALUES (2, 'paul', 'mccartney')
SELECT * FROM dual;



CREATE TABLE address
    (person_id int, address_id int primary key, city varchar2(8))
/
INSERT ALL
    INTO address (person_id, address_id, city)
         VALUES (1, 1, 'new york')
    INTO address (person_id, address_id, city)
         VALUES (1, 2, 'england')
    INTO address (person_id, address_id, city)
         VALUES (1, 3, 'japan')
    INTO address (person_id, address_id, city)
         VALUES (2, 4, 'london')
SELECT * FROM dual;

प्रश्न:

    select  

      p.person_id, p.firstname, p.lastname,

      x.recent_city

    from person p
    left join (

        select person_id,      

            min(city) -- can change this to max(city). will work regardless of min/max

            -- important you do this to get the recent: keep(dense_rank last)

            keep(dense_rank last order by address_id) 
               as recent_city

        from address 
        group by person_id


    ) x on x.person_id = p.person_id

लाइव परीक्षण:http://www.sqlfiddle.com/#!4/7b1c9/ 2

Oracle के KEEP DENSE_RANK विंडोिंग फ़ंक्शन के साथ सभी डेटाबेस में समान कार्यक्षमता नहीं है, आप इसके बजाय सादे विंडोिंग फ़ंक्शन का उपयोग कर सकते हैं:

select  

  p.person_id, p.firstname, p.lastname,

  x.recent_city, x.pick_one_only

from person p
left join (

    select 

        person_id,      

        row_number() over(partition by person_id order by address_id desc) as pick_one_only,
        city as recent_city

    from address 



) x on x.person_id = p.person_id and x.pick_one_only = 1

लाइव परीक्षण:http://www.sqlfiddle.com/#!4/7b1c9/ 48

या टपल परीक्षण का उपयोग करें, उन डेटाबेस पर काम करेगा जो विंडोिंग फ़ंक्शन का समर्थन नहीं करते हैं:

select  

  p.person_id, p.firstname, p.lastname,

  x.recent_city

from person p
left join (

    select   
        person_id,city as recent_city    
    from address 
    where (person_id,address_id) in

          (select person_id, max(address_id)
           from address
           group by person_id)



) x on x.person_id = p.person_id 

लाइव परीक्षण:http://www.sqlfiddle.com/#!4/7b1c9/ 21

हालांकि सभी डेटाबेस पिछले कोड की तरह टपल परीक्षण का समर्थन नहीं करते हैं। आप इसके बजाय जॉइन का उपयोग कर सकते हैं:

select  

  p.person_id, p.firstname, p.lastname,

  x.recent_city

from person p
left join (

    select 

        address.person_id,address.city as recent_city

    from address 
    join 
    (
          select person_id, max(address_id) as recent_id
           from address
           group by person_id
    ) r 
    ON address.person_id = r.person_id
    AND address.address_id = r.recent_id



) x on x.person_id = p.person_id 

लाइव परीक्षण:http://www.sqlfiddle.com/#!4/7b1c9/ 24



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पीएल/एसक्यूएल में एक चर के प्रकार को कैसे देखें?

  2. Oracle में XPath द्वारा पहला तत्व कैसे प्राप्त करें?

  3. महीने के हिसाब से दो तिथियों के बीच के अंतराल को विवरण में कैसे विभाजित करें?

  4. PL/SQL चेक दिनांक मान्य है

  5. Oracle संग्रहीत कार्यविधि:परिणाम सेट और आउट पैरामीटर दोनों लौटाएँ