일반적인 테이블 표현식을 위해 절 중첩 된 조항을 만들 수 있습니까?
-
06-07-2019 - |
문제
WITH y AS (
WITH x AS (
SELECT * FROM MyTable
)
SELECT * FROM x
)
SELECT * FROM y
이와 같은 것이 효과가 있습니까? 나는 그것을 더 일찍 시도했지만 그것을 작동시킬 수 없었다.
해결책
엄격하게 중첩되지는 않지만 일반적인 테이블 표현식을 사용하여 후속 쿼리를 재사용 할 수 있습니다.
이렇게하려면, 당신이 찾고있는 진술의 형태는
WITH x AS
(
SELECT * FROM MyTable
),
y AS
(
SELECT * FROM x
)
SELECT * FROM y
다른 팁
재귀 쿼리라고하는 다음을 수행 할 수 있습니다.
WITH y
AS
(
SELECT x, y, z
FROM MyTable
WHERE [base_condition]
UNION ALL
SELECT x, y, z
FROM MyTable M
INNER JOIN y ON M.[some_other_condition] = y.[some_other_condition]
)
SELECT *
FROM y
이 기능이 필요하지 않을 수 있습니다. 쿼리를 더 잘 정리하기 위해 다음을 수행했습니다.
WITH y
AS
(
SELECT *
FROM MyTable
WHERE [base_condition]
),
x
AS
(
SELECT *
FROM y
WHERE [something_else]
)
SELECT *
FROM x
포함되어 있지 않지만 연속적으로 작동합니다.
;WITH A AS(
...
),
B AS(
...
)
SELECT *
FROM A
UNION ALL
SELECT *
FROM B
편집하다구문을 수정했습니다 ...
또한 다음 예를 살펴보십시오
sqlfiddle 데모
이 답변은 꽤 좋지만 항목을 제대로 주문할 수있는 한이 기사를 보는 것이 좋습니다.http://dataeducation.com/dr-retput-or-how-i-learned-to-stop-worrying-nove-ther-merge
다음은 그의 질문의 예입니다.
WITH paths AS (
SELECT
EmployeeID,
CONVERT(VARCHAR(900), CONCAT('.', EmployeeID, '.')) AS FullPath
FROM EmployeeHierarchyWide
WHERE ManagerID IS NULL
UNION ALL
SELECT
ehw.EmployeeID,
CONVERT(VARCHAR(900), CONCAT(p.FullPath, ehw.EmployeeID, '.')) AS FullPath
FROM paths AS p
JOIN EmployeeHierarchyWide AS ehw ON ehw.ManagerID = p.EmployeeID
)
SELECT * FROM paths order by FullPath
중첩 된 CTE를 만들 수 있습니다. 예에서 아래 CTE를 참조하십시오.
;with cte_data as
(
Select * from [HumanResources].[Department]
),cte_data1 as
(
Select * from [HumanResources].[Department]
)
select * from cte_data,cte_data1
시작과 끝 사이에 여러 프로세스가있는 한 항목을 제외하고 이벤트 사이의 시간을 측정하려고 노력했습니다. 다른 단일 라인 프로세스의 맥락에서 이것을 필요로했습니다.
나는 Nth CTE 내에서 내 선택 문으로 내부 조인으로 선택을 사용했습니다. 두 번째 CTE는 X에서 시작 날짜를 추출하고 y에서 종료 날짜를 추출해야했으며 1 값으로 1 값으로 1 라인에 넣었습니다.
나를 위해 일하고, 이것이 도움이되기를 바랍니다.
cte_extract
as
(
select ps.Process as ProcessEvent
, ps.ProcessStartDate
, ps.ProcessEndDate
-- select strt.*
from dbo.tbl_some_table ps
inner join (select max(ProcessStatusId) ProcessStatusId
from dbo.tbl_some_table
where Process = 'some_extract_tbl'
and convert(varchar(10), ProcessStartDate, 112) < '29991231'
) strt on strt.ProcessStatusId = ps.ProcessStatusID
),
cte_rls
as
(
select 'Sample' as ProcessEvent,
x.ProcessStartDate, y.ProcessEndDate from (
select 1 as Id, ps.Process as ProcessEvent
, ps.ProcessStartDate
, ps.ProcessEndDate
-- select strt.*
from dbo.tbl_some_table ps
inner join (select max(ProcessStatusId) ProcessStatusId
from dbo.tbl_some_table
where Process = 'XX Prcss'
and convert(varchar(10), ProcessStartDate, 112) < '29991231'
) strt on strt.ProcessStatusId = ps.ProcessStatusID
) x
left join (
select 1 as Id, ps.Process as ProcessEvent
, ps.ProcessStartDate
, ps.ProcessEndDate
-- select strt.*
from dbo.tbl_some_table ps
inner join (select max(ProcessStatusId) ProcessStatusId
from dbo.tbl_some_table
where Process = 'YY Prcss Cmpltd'
and convert(varchar(10), ProcessEndDate, 112) < '29991231'
) enddt on enddt.ProcessStatusId = ps.ProcessStatusID
) y on y.Id = x.Id
),
.... 다른 CTE
제휴하지 않습니다 StackOverflow