用 CTE 结果填充 Temp 表?

Posted

技术标签:

【中文标题】用 CTE 结果填充 Temp 表?【英文标题】:Fill Temp table with CTE Resut? 【发布时间】: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 中包含注册日期(更不用说由低效的标量用户定义函数格式化的注册日期)有什么意义? 【参考方案1】:

我认为您在这里的误解是 CTE 不选择任何数据。他们创建了一个表。您必须以与任何其他表相同的方式与该表进行交互。

但是,您的脚本比它需要的要复杂得多。这会有什么问题?

SELECT FirstName,LastName,SubscribedDate, RegisteredDate,dbo.GetShDate(RegisteredDate) as pers
INTO #TEMPY
FROM ClubProfile CP 
WHERE CP.CardNumber IS NOT NULL

这与您的脚本具有相同的结果,但由于脚本中的错误,我无法说出您真正想要的列。

【讨论】:

除了,那个答案是错误的。这个也是,真的。不可能在输出中说出您真正想要的内容,因为您没有用英语或 SQL 描述它。上面的答案将数据加载到临时表中,但从其他地方输出一些不同的数据。这不可能是你想要的 - 你正在创建临时数据而不是使用它?!【参考方案2】:

使用这个

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  into #TEMPX  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  into #TEMPY FROM FIDILIO_CTE2Y

select * from FIDILIO_CTE2Y

【讨论】:

认真的吗?你只是想让别人为你做你的工作?这段代码很糟糕。仍然充满错误。它创建了一个临时表,其中包含一些数据,但最后,它选择了一些其他数据?

以上是关于用 CTE 结果填充 Temp 表?的主要内容,如果未能解决你的问题,请参考以下文章

CTE 和 TEMP 表之间的主要区别是啥?

DML增强功能-CTE

使用单个 PHP 结果集填充 2 列 HTML 表

用 sqlalchemy 查询敲除填充表

创建一个用其他表的记录计数填充的表

CTE 到 Pivot 函数的语法问题