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