Вы можете использовать CTE только с одним запросом после их определений (область действия CTE и последующие CTE - только для одного запроса), например:
create table Table1 (
pkTable1 int primary key
, fkTable2 int
, Column1 nvarchar(max)
)
create table Table2 (
pkTable2 int primary key
, fkTable3 int
, Column2 nvarchar(max)
)
create table Table3 (
pkTable3 int primary key
, Column3 nvarchar(max)
)
; with cte1 as (
select pkTable1, fkTable2, Column1
from Table1
)
, cte2 as (
select pkTable2, fkTable3, Column2
from Table2
)
, cte3 as (
select * from cte1
join cte2 on cte1.fkTable2=cte2.pkTable2
)
select * from cte3
join Table3 on cte3.fkTable3=Table3.pkTable3
(*: поскольку это просто демонстрация, не беспокойтесь о том, как его можно оптимизировать, и запрос не имеет никакого смысла.)
Если вы хотите использовать его в нескольких выражениях, перейдитедля временная таблица или table variable
или вам нужно снова определить CTE
для следующего оператора.
Например, вы можете использовать временную таблицу, например, следующую для достижения того же.
declare @tempTableA table (FieldId nvarchar(4000), FieldName1 nvarchar(4000), FieldName2 nvarchar(4000), FieldName3 nvarchar(4000))
declare @tempTableB table (FieldId nvarchar(4000), FieldName1 nvarchar(4000), FieldName2 nvarchar(4000), FieldName3 nvarchar(4000))
select
FieldId
, FieldName1
, FieldName2
, FieldName3
into #t3 --Assign to temp table
from tableA
cross apply tableB
insert into @tempTableA
select * from #t3 where FieldName1 > 10
insert @tempTableB
select * from #t3 where FieldName1 <= 10
drop table #t3 --Drop the table
Для вашего сценария вам не нужно CTE
, вы можете написать свой запрос следующим образом:
declare @tempTableA table (FieldId nvarchar(4000), FieldName1 nvarchar(4000), FieldName2 nvarchar(4000), FieldName3 nvarchar(4000))
declare @tempTableB table (FieldId nvarchar(4000), FieldName1 nvarchar(4000), FieldName2 nvarchar(4000), FieldName3 nvarchar(4000))
insert into @tempTableA
select
FieldId
, FieldName1
, FieldName2
, FieldName
from tableA
cross apply tableB where FieldName1 > 10
insert @tempTableB
select
FieldId
, FieldName1
, FieldName2
, FieldName
from tableA
cross apply tableB where FieldName1 <= 10