用 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 表?的主要内容,如果未能解决你的问题,请参考以下文章