Oracle 的子查询顺序

Subquery Order by Oracle

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

每个设备都有一个 Company_ID,每个公司都有一个地址。问题是,如果我更改它,旧地址仍然存在,它每次都会为此创建一个新条目。因此,如果我 select 所有具有地址的设备,我都会将一些条目加倍。

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 进行订购,但它什么也没给我,我的错误在哪里?所以我的 company_id.

需要 postal_address 中的最新条目

您的 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 列表中的列值;您可以使用与内联视图相同的行号检查并加入它:

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;