내 취향은 집계 테이블을 사용하는 것입니다. 이렇게 보이는 모든 시스템에 대한 견해를 유지합니다.
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
GO
이 방법으로는 항상 내 손끝에 집계 테이블이 있습니다. 탤리 테이블과 루프를 대체하는 방법에 대한 자세한 내용은 여기에서 읽을 수 있습니다. http://www.sqlservercentral.com/articles/T-SQL/62867/
현재 문제를 해결하기 위해 매우 간단합니다. 먼저 테이블과 샘플 데이터가 필요합니다.
create table #Guest
(
GuestID int identity
, ArrivalDate date
, DepartureDate date
)
insert #Guest
select '2016-06-01', '2016-06-15' union all
select '2016-07-01', '2016-07-12'
여기에 집계 테이블의 기능이 실제로 표시됩니다. 귀하의 도전 과제에 대한 결과를 산출하는 것은이 코드만큼이나 간단합니다.
SELECT GuestID
, ArrivalDate
, DepartureDate
, DATEADD(Day, N - 1, ArrivalDate) as EachDate
from #Guest g
join cteTally t on t.N <= DATEDIFF(day, ArrivalDate, DepartureDate) + 1
order by GuestID
, EachDate
재귀 CTE를 통해 접근이 유형의 또 다른 큰 장점
은 삼각형으로 알려진 사용에 가입하고 일부 성능 문제를 일으킬 수있다는 것이다. 삼각형 조인에 대한 자세한 정보가 있습니다.
http://www.sqlservercentral.com/articles/T-SQL/61539/
내가 그 시도 곳은 있지만, 아무튼 일하지 마라. dbo.Guest 에서 reserveddate 모든 SELECT GuestID, DATEADD (일, 1, dbo.Guest. ArrivalDate) DATEADD dbo.Guest 노동 조합 reserveddate 로 ( SELECT GuestID, ArrivalDate 같은 날짜 (하루, 1, dbo.Guest. ArrivalDate)
쿼리의 재귀 부분에서'dbo.Guest '에'dates'을 (를) 추가해야합니다. – gofr1
어떻게 할 수 있습니까 –