当前位置: 首页 > 面试题库 >

T-SQL:CTE别名的多种用法-不仅在外部查询中

金昂熙
2023-03-14
问题内容

我在一个脚本中使用WITH子句时会发生一个问题。问题很容易指出,我想多次使用CTE别名,而不是仅在外部查询中使用,并且存在症结。

例如:

-- Define the CTE expression
WITH cte_test (domain1, domain2, [...])
AS
-- CTE query
(
    SELECT domain1, domain2, [...]
    FROM table
)
-- Outer query
SELECT * FROM cte_test
-- Now I wanna use the CTE expression another time
INSERT INTO sometable ([...]) SELECT [...] FROM cte_test

最后一行将导致以下错误,因为它在外部查询之外:

消息208,级别16,状态1,第12行无效的对象名称’cte_test’。

有没有办法多次使用CTE。使它持久吗?我当前的解决方案是创建一个临时表,在其中存储CTE的结果,并将此临时表用于任何其他语句。

-- CTE
[...]
-- Create a temp table after the CTE block
DECLARE  @tmp TABLE (domain1 DATATYPE, domain2 DATATYPE, [...])
INSERT INTO @tmp (domain1, domain2, [...]) SELECT domain1, domain2, [...] FROM cte_test
-- Any further DML statements
SELECT * FROM @tmp
INSERT INTO sometable ([...]) SELECT [...] FROM @tmp
[...]

坦白说,我不喜欢这种解决方案。还有其他人对此问题有最佳实践吗?

提前致谢!


问题答案:

CommonTableExpression不会以任何方式持久化数据。基本上,这只是在主查询本身之前创建子查询的一种方法。

与普通子查询相比,它更像是嵌入式视图。因为您可以在一个查询中重复引用它,而不必一次又一次地键入它。

但是它仍然只是一个视图,扩展为引用它的查询,就像宏一样。完全没有数据持久性。

不幸的是,这意味着您必须自己进行持久化。

  • 如果您希望CTE的逻辑得以保留,则您不需要嵌入式视图,而只需要一个视图。

  • 如果要保留CTE的结果集,则需要一种临时表类型的解决方案,例如您不喜欢的解决方案。



 类似资料:
  • 问题内容: 我在为查询中的字段生成别名时遇到问题,例如,该字段为我提供了去年和前一年的收入。我的理解是我可以做些类似的事情: 但这是行不通的。有人知道如何做到这一点吗? 我想以一张桌子结束 在此先多谢! 问题答案: DECLARE @sql VARCHAR(1000); SET @sql = ‘SELECT 1234 AS REVENUE’ + CAST (year(DATEADD(year,-1

  • 问题内容: 我有以下查询,该查询通常可以正常工作,并且应该返回涵盖定义时间范围的所有行(如果没有绝对匹配,则采用最接近的前一行和后一行-在http://www.orafaq.com/node/1834中概述) 但是希望通过引用外部选择来减少两个表的子选择,但是显然它不喜欢它 有没有一种方法可以使查询不选择三个表? 问题答案: 您可以通过联接执行以下操作: 我不是MySQL专家,因此如果需要一些语法

  • 问题内容: 是否可以在使用MySQL的子查询中引用外部查询?我知道在 某些 情况下这是可能的: 但是我想知道这样的事情是否可以工作: 我知道我可以使用或通过将外部子句拉入子查询来实现相同目的,但是我需要这样做来自动生成SQL,并且由于各种其他原因,不能使用任何一种替代方法。 更新 :对不起,这个问题引起了一些混乱:第一个查询只是一个可行的示例,以演示我 不需要的 东西。 更新2 :我需要两个u.i

  • 我有一个带有左连接的SELECT语句,连接的表是子查询。Oracle无法识别第二个子查询中第一个子查询的别名。它适用于DB2,但不适用于Oracle。我如何实现它或重写我的查询? Oracle错误消息:ORA-00904:“B”。“C3”:无效标识符

  • 问题内容: 我对sql中的别名有疑问和疑问。如果我想在同一查询中使用别名,可以使用它。例如:考虑表名xyz与列a和b 这有可能吗? 问题答案: 您是在谈论给查询中的表达式赋予标识符,然后在查询的其他部分重用该标识符吗? 在Microsoft SQL Server中这是不可能的,而我几乎所有的SQL经验都仅限于此。但是您可以执行以下操作。 显然,该示例并不是特别有用,但是如果您在多个地方使用该表达式

  • 我正在使用swagger编辑器记录一个现有的API,该API允许一个路径支持两个不同的请求,这两个请求仅在查询参数名上有所不同。例如: 这里我支持对和的请求。 swagger编辑器不会显示上述yaml的任何错误,但它只为第二个路径(具有UserId和令牌queryparams的路径)生成文档,而不是同时生成。有人能指出我哪里出了问题吗?谢了。 编辑: 如果我将第二个路径更改为(例如),那么我会在文