Как вставить в более чем одну переменную из CTE в различных условиях?
Есть одна таблица, которую я использовал with
предложение для запросов SQL.
Как указано в названии, я хочу вставить в @tempTableA
или же @tempTableB
от SomeTable
в разных условиях.
Но это не работает. Что я неправильно понял в 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))
; with SomeTable as (
select
FieldId
, FieldName1
, FieldName2
, FieldName3
from tableA
cross apply tableB)
insert @tempTableA
select * from SomeTable where FieldName1 > 10
insert @tempTableB
select * from SomeTable where FieldName1 <= 10
1 ответ
Вы можете использовать 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