【发布时间】:2015-01-15 20:22:42
【问题描述】:
我有 2 个 CTE,他们都为我选择了一些记录。其中一个是 X ,另一个是 Y 。另一方面,我有 2 个与 CTE 同名的临时表。我想用 CTE Result 填充这些临时表。最后我想在一个结果中显示这些临时表。 我的问题是我只能在这里使用一次 CTE 数据源 是我的代码
use fidilio
;WITH Fidili_CTE1X ( FirstName,LastName,SubscribedDate, RegisteredDate, pers)
AS
(
SELECT
FirstName,LastName,SubscribedDate, RegisteredDate,dbo.GetShDate(RegisteredDate) as pers
FROM ClubProfile CP
WHERE CP.CardNumber IS NOT NULL
AND IsExpired =0
)
SELECT LastName,pers FROM Fidili_CTE1X
CREATE TABLE #TEMPX
(
Lastname nvarchar(max) ,pers varchar(10)
)
Insert into #TEMPX
select * from Fidili_CTE1X
;WITH FIDILIO_CTE2Y(irstName,LastName,SubscribedDate, RegisteredDate,PERS)
AS
(
SELECT
FirstName,LastName,SubscribedDate, RegisteredDate,dbo.GetShDate(RegisteredDate) as pers
FROM ClubProfile CP
WHERE CP.CardNumber IS NOT NULL
)
SELECT LASTNAME,PERS FROM FIDILIO_CTE2Y
CREATE TABLE #TEMPY
(
Lastname nvarchar(max) ,pers varchar(10)
)
Insert into #TEMPY
select * from FIDILIO_CTE2Y
【问题讨论】:
-
;WITH cte1 AS (SELECT ...), cte2 AS (SELECT ...) SELECT col1,col2 INTO #x FROM (SELECT col1,col2 FROM cte1 UNION ALL SELECT col1,col2 FROM cte2) AS x; -
如果您看到我的代码,我使用了这种方法,但问题是它无法识别我的 cte 数据源
-
您能更正我的代码吗?
-
CTE 本质上只能使用一次,并且只能在声明后直接使用。在您的代码中,您声明您的 CTE fideli_cte1x,然后创建一个临时表,然后您尝试访问它。首先创建你的临时表,然后声明你的 CTE,并立即使用它来插入。如果你想两次使用同一个 CTE,你要么需要声明它两次,要么将 CTE 的内容保存在临时表或表变量之类的东西中,这样你就可以重复访问它们。
-
我无法更正您的代码,因为我无法真正说出您想要什么。查询之间的唯一区别是一个过滤器 IsExpired = 0。您是否希望所有未过期的用户在查询结果中出现两次?此外,由于您从未实际使用过这些列,因此在 CTE 中包含注册日期(更不用说由低效的标量用户定义函数格式化的注册日期)有什么意义?
标签: sql-server common-table-expression