我有两个表,我试图多次连接在一起。 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
*/
答案 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