Присоединение к производному столу - PullRequest
1 голос
/ 13 октября 2009

Я не уверен в терминологии здесь, поэтому позвольте мне привести пример. У меня есть этот запрос:

SELECT * FROM Events
--------------------

Id  Name     StartPeriodId  EndPeriodId
1   MyEvent  34             32

Здесь PeriodIds определяют, как долго длится событие, считайте его неделями года, указанными в другой таблице, если это поможет. Обратите внимание, что EndPeriodId не обязательно последовательно после StartPeriodId. Чтобы я мог сделать это:

SELECT * FROM Periods WHERE Id = 34
-----------------------------------

Id StartDate   EndDate
34 2009-06-01  2009-08-01

Пожалуйста, не останавливайтесь на этой структуре, так как это всего лишь пример, а не то, как она на самом деле работает. Что мне нужно сделать, это придумать этот набор результатов:

Id Name    PeriodId 
1  MyEvent 34
1  MyEvent 33
1  MyEvent 32

Другими словами, мне нужно выбрать строку события для каждого периода, в котором событие существует. Я могу легко рассчитать информацию о Периоде (32, 33, 34), но моя проблема заключается в том, чтобы извлечь ее в одном запросе.

Это в SQL Server 2008.

Ответы [ 2 ]

3 голосов
/ 13 октября 2009

Я могу ошибаться, и я не могу проверить это прямо сейчас, потому что сейчас нет доступного SQL Server, но это не будет просто:

SELECT      Events.Id, Events.Name, Periods.PeriodId
FROM        Periods
INNER JOIN  Events
ON          Periods.ID BETWEEN Events.StartPeriodId AND Events.EndPeriodId
0 голосов
/ 13 октября 2009

Я предполагаю, что вы хотите получить список всех периодов, которые попадают между датами для периодов, указанных идентификаторами начала / конца периода.

With CTE_PeriodDate (ID, MaxDate, MinDate)
as (
Select Id, Max(Dates) MaxDate, MinDate=Min(Dates) from (
Select e.ID, StartDate as Dates from Events e 
Inner join Periods P on P.ID=StartPeriodID
Union All 
Select e.ID, EndDate from Events e
Inner join Periods P on P.ID=StartPeriodID 
Union All 
Select e.ID, StartDate from Events e
Inner join Periods P on P.ID=EndPeriodID
Union All 
Select e.ID, EndDate from Events e
Inner join Periods P on P.ID=EndPeriodID ) as A
group by ID)
Select E.Name, P.ID from CTE_PeriodDate CTE
Inner Join Periods p on 
(P.StartDate>=MinDate and P.StartDate<=MaxDate) 
and (p.EndDate<=MaxDate and P.EndDate>=MinDate) 
Inner Join Events E on E.ID=CTE.ID

Это не лучший способ сделать это, но он работает. Он получает минимальные и максимальные диапазоны дат для периодов, указанных в событии. Используя эти две даты, он соединяется с таблицей периодов значений внутри диапазона между ними.

Kris

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...