Oracle 在 5 个条件下加入 2 个视图
Oracle Join 2 views with 5 conditions
我必须加入 2 个视图 view_a 和 view_b。
view_a 有列 id、address1、address2、city、state、cntry
view_b id,frst_name,last_name,类型,日期,job_title
想要的结果
id,名称,地址 1,地址 2,城市,州,cntry,job_title
我的查询条件是:
1. 在 id 列上加入两个视图。
2. 按日期 desc
排序
3. 连接 first_name 和 last_name
4. 输入等于 "officer"
5. 如果有多于一名军官,则仅产生一名军官,即根据日期排在第一行。
6. 如果没有官员,则结果中的名称和 job_title 列为空值。
我用过的查询:
select
*
from
view_a A
join
(
select
(first_name || ' ' || last_name) as name,
job_title,
id
from
view_b
where
type = 'officer'
and
id is not null
order by date desc fetch first 1 row only
) B
on A.id=B.id
但是这个查询只产生了一个结果。我正在使用 Oracle 12c。这些视图中大约有 800K 条记录。
你可以这样做:
select id,
name,
address1,
address2,
city,
state,
cntry,
job_title
(select
a.id,
nvl2(nvl(b.first_name, b.last_name),b.first_name||' '||b.last_name,null) Name,
a.address1,
a.address2,
a.city,
a.state,
a.cntry,
b.job_title,
a.date
row_number() over (partition by a.id order by a.date desc nulls last) rn
from
view_a a left outer join
view_b b
on a.id = b.id
and b.type = 'officer')
where rn = 1
order by date desc nulls last;
以下也解决了问题:
SELECT *
FROM view_a a
LEFT JOIN (SELECT name, job_title, id
FROM (SELECT (first_name || ' ' || last_name) AS name,
job_title,
id,
ROW_NUMBER() OVER(PARTITION BY id ORDER BY date DESC) rn
FROM view_b
WHERE TYPE = 'officer' AND id IS NOT NULL)
WHERE rn = 1) b
ON a.id = b.id
我必须加入 2 个视图 view_a 和 view_b。
view_a 有列 id、address1、address2、city、state、cntry
view_b id,frst_name,last_name,类型,日期,job_title
想要的结果
id,名称,地址 1,地址 2,城市,州,cntry,job_title
我的查询条件是:
1. 在 id 列上加入两个视图。
2. 按日期 desc
排序
3. 连接 first_name 和 last_name
4. 输入等于 "officer"
5. 如果有多于一名军官,则仅产生一名军官,即根据日期排在第一行。
6. 如果没有官员,则结果中的名称和 job_title 列为空值。
我用过的查询:
select
*
from
view_a A
join
(
select
(first_name || ' ' || last_name) as name,
job_title,
id
from
view_b
where
type = 'officer'
and
id is not null
order by date desc fetch first 1 row only
) B
on A.id=B.id
但是这个查询只产生了一个结果。我正在使用 Oracle 12c。这些视图中大约有 800K 条记录。
你可以这样做:
select id,
name,
address1,
address2,
city,
state,
cntry,
job_title
(select
a.id,
nvl2(nvl(b.first_name, b.last_name),b.first_name||' '||b.last_name,null) Name,
a.address1,
a.address2,
a.city,
a.state,
a.cntry,
b.job_title,
a.date
row_number() over (partition by a.id order by a.date desc nulls last) rn
from
view_a a left outer join
view_b b
on a.id = b.id
and b.type = 'officer')
where rn = 1
order by date desc nulls last;
以下也解决了问题:
SELECT *
FROM view_a a
LEFT JOIN (SELECT name, job_title, id
FROM (SELECT (first_name || ' ' || last_name) AS name,
job_title,
id,
ROW_NUMBER() OVER(PARTITION BY id ORDER BY date DESC) rn
FROM view_b
WHERE TYPE = 'officer' AND id IS NOT NULL)
WHERE rn = 1) b
ON a.id = b.id