Sql Query сначала, затем, последние строки в наборе - PullRequest
3 голосов
/ 27 октября 2009

У меня есть две таблицы, которые я пытаюсь объединить несколько раз. Родительская таблица называется Jobs, а дочерняя таблица называется Routings. Работа может иметь 1 или более маршрутов. Мне нужно, чтобы мой вывод содержал одну запись для каждого задания, объединенную с тремя отдельными соединениями в таблицу маршрутизации. Одно соединение предназначено для текущих данных (первое нулевое значение даты в последовательности), одно для следующего (последовательность идет сразу после текущего) и финальное для последнего (определяется как наивысший порядковый номер для задания).

Ниже приведен небольшой пример, который я собрал для предоставления данных выборки и желаемого результата. Это переводит проблему в более простую форму, показывая на самом деле только 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 ]

1 голос
/ 27 октября 2009

Я пытался выполнить этот запрос через множество объединений, но, похоже, результаты пропускаются, когда следующей маршрутизации не существует (мне нужны нулевые значения). Выполнение левого внешнего соединения не помогло.

Убедитесь, что вы добавили фильтры к внешним объединенным таблицам в предложении 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

Вторая версия эквивалентна внутреннему соединению.

0 голосов
/ 27 октября 2009

Вот одно из решений

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
0 голосов
/ 27 октября 2009

Разве не имеет смысла хранить эти значения в виде столбцов в таблице заданий? Тогда просто обновите их, когда (я предполагаю) ваш рабочий процесс требует этого? Тогда вы можете просто выполнить 2 внутренних соединения Jobs-> Routes на предыдущем шаге и Jobs-> Routes на следующем шаге.

...