所需的基本查询看起来像:
select p.pos_id, p.pos_description,
row_number() over (partition by p.pos_id order by e.emp_id) as SerialNumber,
e.emp_id
from positions p left outer join
employees e
on p.pos_id = e.emp_pos_id
order by 1, 2, 3
的问题是,这不返回空位置。因为,可以想象,每个职位都可能是空的,在这种情况下需要什么?
select p.pos_id, p.pos_description,
row_number() over (partition by p.pos_id order by p.pos_id) as SerialNumber,
NULL as emp_id
from position p join
(select row_number() over (partition by NULL order by pos_id) as seqnum
from positions
) as numbers
on numbers.seqnum <= p.pos_total
在这里,我只是使用表来创建一个数字列表。我加入到这些职位。
下一个查询使用连接结合了其中两个:
with byemp as (
select p.pos_id, p.pos_description,
row_number() over (partition by p.pos_id order by e.emp_id) as SerialNumber,
e.emp_id
from positions p left outer join
employees e
on p.pos_id = e.emp_pos_id
),
allpos as (
select p.pos_id, p.pos_description,
row_number() over (partition by p.pos_id order by p.pos_id) as SerialNumber,
NULL as emp_id
from position p join
(select row_number() over (partition by NULL order by pos_id) as seqnum
from positions
) as numbers
on numbers.seqnum <= p.pos_total
)
select allpos.pos_id, allpos.pos_description, allpos.SerialNumber,
coalesce(byemp.emp_id, allpos.emp_id) as emp_id
from allpos join
byemp
on allpos.pos_id = byemp.pos_id and
allpos.SerialNumber = byemp.SerialNumber
基本上,它是保持从allpos所有的位置信息,而是从byemp带来的EMPID可用时。
那么该查询的情况下,失败时位置的表行的总数小于pos_total。在将DBA位置的pos_total更新为4之后,运行上面的示例。它不会为DBA生成4个空白行,它应该有.. –
非常感谢。我将最后一个JOIN修改为LEFT JOIN并且它正在工作 – klgr