2009-10-13 2 views
1

여기서는 전문 용어에 대해 잘 모르겠습니다. 예를 들어 보겠습니다.파생 테이블에 대한 연결

여기에서
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 서버에 2008

답변

3

내가 착각, 나는 지금 사용 가능한 SQL 서버가 없기 때문에 지금 그것을 테스트 할 수 있지만 단순히되지 않을 것 :

SELECT  Events.Id, Events.Name, Periods.PeriodId 
FROM  Periods 
INNER JOIN Events 
ON   Periods.ID BETWEEN Events.StartPeriodId AND Events.EndPeriodId 
+0

아니 정확히 내가 질문에 말했듯이 때문에 "라고 EndPeriodId 반드시 StartPeriodId 후 순차적으로되지 않는다는 것을 통지". 즉, BETWEEN에 의지 할 수 없으며 기간의 실제 날짜를 볼 필요가 있음을 의미합니다. –

+0

그래도 비슷한 것을 사용할 수있는 것처럼 보입니다. 그냥 확인하는 것입니다! –

+0

나는 당신을 사랑한다 Maximilian Mayerl. –

0

시작/종료 기간 ID로 지정된 기간의 기간 사이에있는 모든 기간의 목록을 원한다고 가정합니다.

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 

이렇게하는 것이 가장 좋은 방법은 아니지만 올바르게 작동합니다. 이벤트에 지정된 기간의 최소 및 최대 날짜 범위를 가져옵니다. 이 두 날짜를 사용하여 둘 사이의 범위 안에있는 값에 대해 기간 테이블과 조인합니다.

크리스

관련 문제