简体   繁体   中英

Subquery Order by Oracle

My Database has 3 Tables, Device,Postal_Address and Company.

Every Device has an Company_ID, and for every company there is an address. The problem is, the old address is still there if i change it, its everytime making a new entry for this. So if i select all devices with address i get some entrys doubled.

select d.device,
 ( 
           select postalcode_address from 
           ( 
                select  
                     pa.postalcode_address,   
                     row_number() over (order by pa.last_update desc) r,
                     pa.company_id
                from   
                     postal_address pa   
           )  
             where  company_id=c.company_id
            AND r=1

      ) as Postcode
from device d,company c,
where d.company_id = c.company_id(+) 

I have tried it with order the address withlast_update, but its getting me nothing back, where is my error? so i need the newest entry in the postal_address for my company_id.

Your row_number() analytic call is getting the row number across all companies, so you'll only get a match for the most-recently-changed company; no other company will get r = 1 . You need to partition by the company ID:

row_number() over (partition by pa.company_id order by pa.last_update desc) r,

Or move the where company_id=c.company_id inside that nested subquery; but that doesn't work in some versions of Oracle (the c alias might not be visible).


I wouldn't use a subquery to get the column value within the select list at all here though; you could use the same row number check as an inline view and join to it:

select d.device, pa.postalcode_address
from device d
left join company c on c.company_id = d.company_id
left join (
  select company_id, postalcode_address,
    row_number() over (partition by company_id order by last_update desc) rn
  from postal_address
) pa on pa.company_id = c.company_id and pa.rn = 1;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM