Oracle的子查询订单

时间:2015-03-06 10:23:05

标签: sql oracle subquery sql-order-by

我的数据库有3个表,设备,Postal_Address和公司。

每个设备都有一个Company_ID,每个公司都有一个地址。问题是,如果我改变它,旧地址仍然存在,它每次为此创建一个新条目。因此,如果我选择所有带有地址的设备,我会得到一些转换。

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(+) 

我已经尝试过订购地址withlast_update,但它没有给我任何回复,我的错误在哪里?所以我需要postal_address中最新的条目为我的company_id。

1 个答案:

答案 0 :(得分:2)

您的row_number()分析调用正在获取所有公司的行号,因此您只会获得最近更改过的公司的匹配项;没有其他公司会得到r = 1。您需要按公司ID进行分区:

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

或者移动嵌套子查询中的where company_id=c.company_id;但这在某些版本的Oracle中不起作用(c别名可能不可见。)


我不会使用子查询来获取选择列表中的列值;您可以使用相同的行号检查作为内联视图并加入它:

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;