Sql Query First,Next,Last Rows in a Set

时间:2009-10-27 19:47:34

标签: sql sql-server tsql sql-server-2000

我有两个表,我试图多次连接在一起。 Parent表称为Jobs,子表称为Routings。一个Job可以有一个或多个Routings。我需要输出包含每个作业的一条记录,并与Routings表连接三个单独的连接。一个连接用于当前数据(序列中的第一个空值日期值),一个用于下一个(紧接在当前之后的序列)和最后一个用于最后一个(定义为作业的最高序列号)。

下面是我放在一起提供样本数据和所需输出的小样本。它将问题转化为更简单的形式,实际上只显示Routings而不是Job表。如果我能找到一种更容易提取当前,下一个和最后一个值的方法,我可以从那里获取它。

我通过许多连接尝试了这个查询,但是当没有下一个路由存在时我似乎省略了结果(我需要空值)。执行左外连接并没有解决这个问题。我不确定这是因为它是 SQL Server 2000 还是什么。

drop table #routing

create table #routing
(
routingId int not null primary key,
jobid int not null,
sequence int not null,
sentdate datetime
)

insert into #routing
select
1, 1, 1, '1/1/2009'
union
select
2, 1, 2, '1/2/2009'
union
select
3, 1, 3, '1/3/2009'
union
select
4, 1, 4, null
union
select
5, 1, 5, null
union
select
6, 2, 1, '1/1/2009'
union
select
7, 2, 2, '1/2/2009'
union
select
8, 2, 3, '1/3/2009'

select * from #routing


/*
Expected Result:

Two Records, one for each job

JobId,  CurrentRoutingId,   NextRoutingId,  LastRoutingId
1       4                   5               5
2       null                null            8

*/

3 个答案:

答案 0 :(得分:1)

  

我通过许多连接尝试了这个查询,但是当没有下一个路由存在时我似乎省略了结果(我需要空值)。执行左外连接并没有解决这个问题。

确保在JOIN子句中对外连接表放置任何过滤器,而不是WHERE子句。例如:

select curr.jobid, curr.routingid, prev.routingid as prev_routingid
from #routing curr
left join #routing prev 
  on curr.jobid = prev.jobid
 and curr.sequence = prev.sequence+1

而不是:

select curr.jobid, curr.routingid, prev.routingid as prev_routingid
from #routing curr
left join #routing prev 
  on curr.jobid = prev.jobid
where curr.sequence = prev.sequence+1

第二个版本相当于内部联接。

答案 1 :(得分:0)

将这些值存储为作业表中的列是不是有意义?然后只是在(我假设)你的工作流程要求它时更新它们?然后你可以做2个内连接工作 - >上一步的路由和下一步的工作 - >路线。

答案 2 :(得分:0)

这是一个解决方案

select r.jobid, min(rn.routingid) as nextroutingid, max(rl.routingid) as lastroutingid,
max(rn.routingid) as currentroutingid
from routing r
    left join routing rn on (rn.jobid = r.jobid) and (rn.sentdate is null)
    left join routing rl on (rl.jobid = r.jobid)
group by r.jobid