我的数据库有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。
答案 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;